2

可能重复:
哪个是 IEEE 754 浮点数无法准确表示的第一个整数?

这是基本问题,我的感觉是答案是肯定的(int = 32 bits,double = 53 bit mantisa + sign bit)。

基本上可以断言火?

int x = get_random_int();
double dx = x;
int x1 = (int) dx;
assert(x1 ==x);
if  (INT_MAX-10>x)
 {
       dx+=10;
       int x2=(int) dx;
       assert(x+10 == x2);
 }

显然,涉及具有除法和类似内容的复杂表达式的东西( (int)(5.0/3*3) 与 5/3*3 不同)不起作用,但我想知道转换和加法/减法(如果没有发生溢出)保持对等。

4

2 回答 2

5

如果尾数中的位数 >= 整数中的位数,那么答案是肯定的。在您的问题中,您给出了int和 的尾数的特定已知大小,但知道 2003 C++ 标准double保证这一点很有用,该标准没有说明和尾数的相对大小。intdouble

请注意,C 和 C++ 不需要使用 IEEE 754 浮点运算。根据 2003 C++ 标准的 3.8.1/8,

浮点类型的值表示是实现定义的。

事实上,C++ 允许甚至不使用二进制尾数的浮点表示。对于 C,#include <limits.h> 可用于推断有关基本类型的信息。特别是,如果FLT_RADIX升幂DBL_MANT_DIG大于或等于INT_MAX,则所有int值都可以精确表示。在 C++ 中,相关的量被命名numeric_limits<double>::radixnumeric_limits<double>::digitsnumeric_limits<int>::max()

给定两个整数操作数和一个始终从整数操作数生成整数的运算(例如+or *,但不是/),所有 IEEE 754 舍入模式都将精确生成整数。如果这个整数可以在 an 中表示int(因此可以在 adouble中准确表示,假设我们假设它的尾数至少与 an 一样宽int),那么它将与您使用相应的整数运算得到的整数相同。任何合理的 FP 实现都将保留上述保证,即使它不符合 IEEE 754 标准。

于 2012-11-07T12:49:51.077 回答
3

是的。所有N位整数都可以用浮点表示表示,该表示至少具有N-1尾数位(因为不需要存储隐式前导 1 位)和可以存储至少N的指数,即具有log(N)+1位。

因此,您可以将 a 存储int32_t在具有 31 位尾数、5 位指数和 1 个符号位的浮点值中,这适合典型double但不适合 a float。相反,float只有 24 位尾数的 a 只能准确存储int最多 25 位的 s,即 +/-33,554,431。

于 2012-11-07T12:39:06.990 回答