Суть проблемы: надо из double сделать int, убрав дробную часть. Казалось, бы всего ничего, преобразовать в int, но не работает, причём выдаёт воистину чудовищный результат: 6.000000 превращается в 5. Подозреваю, что тут что-то с точностью, так как если сделать не double а long double проблема исчезает. На некоторое время, потому что если взять число побольше, опять n превращается в n-1. Пробовал не (int) y, а floor(y) - та же проблема. Вот пример, чтобы не быть голословным:
Код | #include <stdio.h> int main() { int i; double y = 0; int dx = 5; int dy = 3; double k = (double) dy/dx; for ( i=0; i<11; i++, y+=k ) printf( "y = %f, y_rounded = %i\n", y, (int) y ); }
|
Здесь формируется игрик, через складывание множества дробных чисел. При этом программа выдаёт:
Код | y = 0.000000, y_rounded = 0 y = 0.600000, y_rounded = 0 y = 1.200000, y_rounded = 1 y = 1.800000, y_rounded = 1 y = 2.400000, y_rounded = 2 y = 3.000000, y_rounded = 3 y = 3.600000, y_rounded = 3 y = 4.200000, y_rounded = 4 y = 4.800000, y_rounded = 4 y = 5.400000, y_rounded = 5 y = 6.000000, y_rounded = 5
|
Последняя строка убивает. Товарищи, в чём дело? Работаю в линуксе, через gcc. |