关于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.14f0.140.14L的行为不同。
舍入模式影响乘法的行为,而不是0.14f0.140.14L(*的值)。为什么0.14 * 50 > 70.14的值有关,而与*的行为有关。因此,不要假设*单独执行的舍入模式解释了您看到的内容。
对于最早模式的浮点运算来说,双类型是否更危险?
不,绝对不是。
请注意,为了有意义,您的float实验应该float res = 0.14f*50;。否则,将乘以一个双精度常数0.14,然后将结果舍入为浮点数。这种运算比单精度十进制常数相乘更频繁地产生数学结果是正常的,但这与舍入模式和乘法的实际操作数无关。
(*)C99 6.4.4.2:5浮动常量转换为内部格式,就好像在转换时一样。

关于c - 使用最接近的浮点算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23915269/

10-16 09:10