Проверьте свой math.h файл. Если Вы удачливы, что имеете nextafter
и nextafterf
функции, определяемые. Они делают точно, что Вы хотите портативным и независимым от платформы способом и являетесь частью стандарта C99.
Другой способ сделать оно (могло быть решение для нейтрализации) должно разложить Ваше плавание на часть экспоненты и мантиссу. Постепенное увеличение легко: Просто добавьте тот к мантиссе. Если Вы получаете переполнение, необходимо обработать это путем постепенного увеличения экспоненты. Постепенное уменьшение работает тот же путь.
РЕДАКТИРОВАНИЕ : Как указано в комментариях достаточно просто увеличить плавание в, он - двоичное представление. Переполнение мантиссы увеличит экспоненту, и это точно, что мы хотим.
Это - вкратце то же самое, которое делает nextafter.
Это не будет абсолютно портативно все же. Необходимо было бы иметь дело с порядком байтов и тем, что не все машины действительно имеют плавания IEEE (хорошо - последняя причина является более академической).
Также обрабатывающий NAN's и большое количество может быть немного хитрым. Вы не можете просто увеличить их, поскольку они - по определению не числа.
вы можете объявить статический массив с данными для инициализации из:
static int initvalues[3] = {1,2,3};
…
if(1)
memmove(values,initvalues,sizeof(values));
Вы можете выполнять множественное присвоение только массива, когда вы объявляете массив:
int values[3] = {1,2,3};
После объявления вам нужно будет присвоить каждое значение индивидуально, т.е.
if (1)
{
values[0] = 1;
values[1] = 2;
values[2] = 3;
}
Или вы можете использовать цикл, в зависимости от того, какие значения вы хотите использовать.
if (1)
{
for (i = 0 ; i < 3 ; i++)
{
values[i] = i+1;
}
}
//compile time initialization
int values[3] = {1,2,3};
//run time assignment
value[0] = 1;
value[1] = 2;
value[2] = 3;
В C99, используя ] составных литералов , вы можете:
memcpy(values, (int[3]){1, 2, 3}, sizeof(int[3]));
или
int* values = (int[3]){1, 2, 3};
Также возможно скрыть memcpy, используя блочную копию структур компилятора. Это делает код некрасивым из-за всех .i и i :, но, возможно, это решает вашу конкретную проблему.
typedef struct {
int i[3];
} inta;
int main()
{
inta d = {i:{1, 2, 3}};
if (1)
d = (inta){i:{4, 5, 6}};
printf("%d %d %d\n", d.i[0], d.i[1], d.i[2]);
return 0;
}
Это работает и оптимизируется лучше под gcc с -O3 (компилятор полностью удаляет код), тогда как memcpy заставляет копировать память во всех случаях.
template <typename Array>
struct inner
{
Array x;
};
template <typename Array>
void assign(Array& lhs, const Array& rhs)
{
inner<Array>& l( (inner<Array>&)(lhs));
const inner<Array>& r( (inner<Array>&)(rhs));
l = r;
}
int main()
{
int x[100];
int y[100];
assign(x, y);
}