是否可以将所有32位整数精确表示为双精度?

时间:2012-11-07 12:10:12

标签: double ieee-754

  

可能重复:
  Which is the first integer that an IEEE 754 float is incapable of representing exactly?

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

基本上可以断言?

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不相同不会工作,但我想知道转换和adition / substraction(如果没有)溢出发生)保持等价。

2 个答案:

答案 0 :(得分:4)

如果尾数中的位数> = =整数中的位数,则答案为是。在您的问题中,您为int提供了特定的已知大小和double的尾数,但有必要知道2003 C ++标准保证,没有关于intdouble的尾数的相对大小。

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

  

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

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

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

答案 1 :(得分:3)

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

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