C ++中的双精度数字

时间:2009-10-05 16:54:13

标签: c++ floating-point range

IEE754(64位)浮点应该正确表示15位有效数字,尽管内部表示有17个数字。有没有办法强制第16和第17位数为零??

价: http://msdn.microsoft.com/en-us/library/system.double(VS.80).aspx: 。

请记住,浮点数只能近似一个十进制数,并且浮点数的精度决定了该数字接近十进制数的准确程度。默认情况下,Double值包含15个十进制数字的精度,但内部最多保留17位数。浮点数的精度有几个结果: 。

示例:  d1 = 97842111437.390091
 d2 = 97842111437.390076
d1和d2在16和17小数位上有所不同,这些小数位不应该是重要的。寻找迫使他们归零的方法。即  d1 = 97842111437.390000  d2 = 97842111437.390000

5 个答案:

答案 0 :(得分:11)

没有。反例:两个最接近理论值的浮点数

1.11111111111118

(有15位小数)是

1.1111111111111799942818834097124636173248291015625
1.1111111111111802163264883347437717020511627197265625

换句话说,没有以1.1111111111111800开头的浮点数。

答案 1 :(得分:3)

这个问题有点畸形。硬件存储数字 二进制,而不是十进制。所以在一般情况下你不能做到精确 基数为10的数学。一些十进制数(0.1是其中之一!)不 甚至在二进制中有一个非重复的表示。如果你有 这样的精度要求,你关心的数字 精确到15位十进制数,你需要 为你的号码选择另一个代表。

答案 2 :(得分:3)

不,但我想知道这是否与您的任何问题相关(GCC具体):

GCC Documentation

  

-ffloat-store不要将浮点变量存储在寄存器中,和   禁止可能的其他选项   更改是否为浮点值   取自寄存器或记忆。

     

此选项可防止不受欢迎   机器上的精度过高等   68000浮动寄存器   (68881)保持更高的精度   应该有一个双倍。   同样适用于x86架构。   对于大多数程序来说,多余的   精确度只有好,但少数   程序依赖于精确   IEEE浮点的定义。使用   -ffloat-store用于此类程序,在修改它们以存储所有相关的   中间计算到   变量

答案 3 :(得分:0)

您应该能够通过创建一个带有浮点数字段和相同大小的整数类型的联合来直接修改数字中的位。然后,您可以访问所需的位并根据需要进行设置。这是我打破标志位的例子;当然,你可以选择你想要的任何领域。

#include <stdio.h>

union double_int {
  double             fp;
  unsigned long long integer;
};

int main(int argc, const char *argv[])
{
  double            my_double = 1325.34634;
  union double_int  *my_union = (union double_int *)&my_double;

  /* print original numbers */
  printf("Float   %f\n", my_double);
  printf("Integer %llx\n", my_union->integer);

  /* whack the sign bit to 1 */
  my_union->integer |= 1ULL << 63;

  /* print modified numbers */
  printf("Negative float   %f\n", my_double);
  printf("Negative integer %llx\n", my_union->integer);

  return 0;
}

答案 4 :(得分:0)

一般来说,人们在显示数字时只关心这样的事情(“我只想要第一个 x 数字”)。 stringstreamsprintf

相对容易

如果您担心将数字与==进行比较;你真的不能用浮点数做到这一点。相反,你想看看这些数字是否足够接近(比如,在epsilon()之内)。

直接玩这些数字并不是一个好主意。