是否存在两个整数i
和j
都适合IEEE 754整数倍(小于DBL_MAX
),但to_double(i)/to_double(j)
不等于to_double(i/j)
,其中i/j
的执行精度是无限的?
(我们可以假设to_double
是舍入到偶数)。
我的问题与Invertability of IEEE 754 floating-point division类似,但我认为它不是等效的,或者至少我不知道如何使用它来反驳我的问题。
答案 0 :(得分:2)
是的。在double
是IEEE-754基本64位二进制浮点数(具有53位有效数字)和long double
具有64位有效数字的C实现中,输出:
#include <stdio.h>
int main(void)
{
long double x = 0x1p154L - 0x1p101L + 0x1p100L;
long double y = 0x1p153L + 0x1p101L - 0x1p100L;
long double z = x / y;
double X = x;
double Y = y;
double Z = X/Y;
printf("x = %La.\n", x);
printf("y = %La.\n", y);
printf("z = %La.\n", z);
printf("X = %a.\n", X);
printf("Y = %a.\n", Y);
printf("Z = %a.\n", Z);
printf("(double) z = %a.\n", (double) z);
}
是:
x = 0xf.ffffffffffffcp+150. y = 0x8.0000000000004p+150. z = 0xf.ffffffffffff4p-3. X = 0x1p+154. Y = 0x1p+153. Z = 0x1p+1. (double) z = 0x1.ffffffffffffep+0.当然,
x / y
的精度为long double
,而不是无限精度,但是它捕获了足够的信息以显示无限精度的结果将具有相同的最终结果-插入{{1} }和#include <math.h>
将z = nexttowardl(z, INFINITY);
更改为(double) z
,但这仍然不等于0x1.fffffffffffffp+0
。