IEEE 754:除法前的转换会导致精度损失吗?

时间:2019-06-18 03:37:26

标签: floating-point precision division arbitrary-precision

是否存在两个整数ij都适合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类似,但我认为它不是等效的,或者至少我不知道如何使用它来反驳我的问题。

1 个答案:

答案 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