关于C中的fenv.h库,我很难理解使用fesetround()时舍入方向模式的作用,尤其是feu TONEAREST(默认)方向。
库中有4种舍入方向:
最早
向上
向下飞
向零前进
双打:
double res = 0.14*50;
printf ("res = %.50lf \n",res);
返回:
res = 7.00000000000000088817841970012523233890533447265625
(编译器说res>7)
然而,在漂浮物上:
float res = 0.14*50;
printf ("res = %.50f \n",res);
返回
7.00000000000000000000000000000000000000000000000000
(res=7)长双打:
long double a;
long double b;
scanf("%Lf",&a);
scanf("%Lf",&b);
long double res = a*b;
printf("%.50Lf \n",res);
返回
7.00000000000000000000000000000000000000000000000000
(res=7)对于最早模式的浮点运算来说,双类型是否更危险?
最佳答案
您的问题与舍入到最接近的舍入模式无关,该模式仍然是默认模式。你的问题的答案是0.14f
不同于0.14
不同于0.14L
,它们都不等于14/100的数学比率。当乘以50时,这些(不同的)数字0.14f
、0.14
和0.14L
的行为不同。
舍入模式影响乘法的行为,而不是0.14f
、0.14
和0.14L
(*的值)。为什么0.14 * 50 > 7
与0.14
的值有关,而与*
的行为有关。因此,不要假设*
单独执行的舍入模式解释了您看到的内容。
对于最早模式的浮点运算来说,双类型是否更危险?
不,绝对不是。
请注意,为了有意义,您的float
实验应该float res = 0.14f*50;
。否则,将乘以一个双精度常数0.14
,然后将结果舍入为浮点数。这种运算比单精度十进制常数相乘更频繁地产生数学结果是正常的,但这与舍入模式和乘法的实际操作数无关。
(*)C99 6.4.4.2:5浮动常量转换为内部格式,就好像在转换时一样。
关于c - 使用最接近的浮点算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23915269/