ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
275235 Топик полностью
fk0, легенда (28.09.2011 14:39, просмотров: 136) ответил Dany на Это ручное округление в большую сторону. Вот ситуация где вредно округлять в большую сторону, ожидаемое значение 999
Чушь! 9.995 * 100.0 = 999.5 И простое округление, а не в большую сторону, должно дать 1000. С какого это должно получиться 999? Вы таки хотите floor(), т.е. без округления? Ну тогда зачем же жаловаться, что 4.45*100.0 = 444.999[9] и, в итоге ~= 444 ? Хочется получить, видимо, таки округление, но не до целых, а, например, до 1/100. Смотри пример (компилировать строго в GCC, во-избежание...): #include <math.h> #include <stdlib.h> #include <stdio.h> volatile float x=4.45; int main() { volatile float a, b, c; volatile int y; a=x*100; b=445.0; c=a+1/100.0; printf("%f, %f, %f : %8.8lx, %8.8lx, %8.8lx\n", (double)a, (double)c, (double)b, *(unsigned long*)&a, *(unsigned long*)&c, *(unsigned long*)&b); y=({ char s[16]; sprintf(s, "%.2f", (double)a), atoi(s);}); printf("y=%d\n", y); return 0; } Вывод программы:
$ ./a.out 
444.999969, 445.009979, 445.000000  : 43de7fff, 43de8147, 43de8000
y=445
[ZX]