3

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

4

5 回答 5

13

No. 反例:最接近有理数的两个浮点数

1.11111111111118

(有 15 个十进制数字)是

1.1111111111111799942818834097124636173248291015625
1.1111111111111802163264883347437717020511627197265625

换句话说,不存在以 开头的浮点数1.1111111111111800

于 2009-10-05T18:10:19.137 回答
3

这个问题有点畸形。硬件以二进制而不是十进制存储数字。因此,在一般情况下,您无法以 10 为底进行精确的数学运算。一些十进制数(0.1 就是其中之一!)甚至没有二进制的非重复表示。如果您有这样的精度要求,您关心数字的已知精度精确到 15 位十进制数字,您将需要为您的数字选择另一种表示形式。

于 2009-10-05T18:13:02.250 回答
3

不,但我想知道这是否与您的任何问题有关(特定于 GCC):

GCC 文档

-ffloat-store 不要将浮点变量存储在寄存器中,并禁止其他可能改变浮点值是从寄存器还是内存中获取的选项。

此选项可防止在诸如 68000 之类的机器上出现不希望出现的过度精度,其中浮动寄存器(68881 的)保持比双精度应有的精度更高。对于 x86 架构也是如此。对于大多数程序来说,超额精度只会带来好处,但少数程序依赖于 IEEE 浮点的精确定义。在修改它们以将所有相关的中间计算存储到变量中之后,对此类程序使用 -ffloat-store。

于 2009-10-05T18:15:50.217 回答
0

一般来说,人们在显示数字时只关心这样的事情(“我只想要前x位”)。stringstream使用s 或相对容易sprintf

如果您担心将数字与==; 你真的不能用浮点数做到这一点。相反,您想查看数字是否足够接近(例如,epsilon()彼此之间)。

直接玩数字的位不是一个好主意。

于 2009-10-05T18:35:48.553 回答
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;
}
于 2009-10-05T17:46:22.740 回答