C++ C+中的两位数字+;

C++ C+中的两位数字+;,c++,floating-point,range,C++,Floating Point,Range,IEE754(64位)浮点应该正确表示15个有效数字,尽管内部表示有17个DITIG。有没有办法将第16位和第17位数字强制为零 参考: : . 请记住,浮点数只能近似于十进制数,而浮点数的精度决定了该数字近似于十进制数的精度。默认情况下,双精度值包含15位小数精度,但内部最多保留17位。浮点数的精度有几个后果: . 示例编号: d1=97842111437.390091 d2=97842111437.390076 d1和d2在第16位和第17位小数点后不同,这两位小数点不应该很重要。想办法

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

参考: : .

请记住,浮点数只能近似于十进制数,而浮点数的精度决定了该数字近似于十进制数的精度。默认情况下,双精度值包含15位小数精度,但内部最多保留17位。浮点数的精度有几个后果: .

示例编号: d1=97842111437.390091
d2=97842111437.390076
d1和d2在第16位和第17位小数点后不同,这两位小数点不应该很重要。想办法把他们逼到零。即 d1=97842111437.390000
d2=97842111437.390000

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

#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;
}
#包括
并集双精度{
双fp;
无符号长整数;
};
int main(int argc,const char*argv[]
{
双倍我的双=1325.34634;
联合双精度*我的联合=(联合双精度*)和我的双精度;
/*打印原始号码*/
printf(“浮动%f\n”,我的双精度);
printf(“整数%llx\n”,我的联合->整数);
/*将符号位猛击为1*/
my_union->integer |=1整数);
返回0;
}

否。反例:与有理数最接近的两个浮点数

1.11111111111118
(有15位十进制数字)是


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

这个问题的格式有点不正确。硬件存储数字 二进制的,不是十进制的。所以在一般情况下,你不能做精确的 数学以10为基数。有些十进制数(0.1是其中之一!)不适用 甚至有一个二进制的非重复表示。如果你有 像这样的精度要求,你关心的是数字 由于已知精度精确到15位小数,您需要
为您的数字选择另一种表示方式。

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

-ffloat存储不在寄存器中存储浮点变量,以及 禁止其他可能导致 更改是否为浮点值 从寄存器或内存中获取

此选项可防止出现不必要的错误 机器上的过度精度,例如 浮点寄存器所在的68000 (68881的)保持更高的精度 比双人间还多。 x86体系结构也是如此。 对于大多数程序来说,多余的 精确只会带来好处,但也会带来一些好处 程序依赖于精确的 IEEE浮点定义。使用 -对这些程序进行修改以存储所有相关的 中间计算到 变量


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

如果您关心将数字与
==
进行比较;你真的不能用浮点数来做这件事。相反,您希望看到这些数字是否足够接近(例如,彼此之间的距离在一个范围内)


直接使用数字位不是一个好主意。

您是说64位浮点吗?至于15位有效的十进制数字,我同意约翰·W的观点。这个问题有点模糊。内部表示根本不是十进制的。IEEE754 double有52位尾数:除了Intel使用80位浮点寄存器和64位尾数(约19位分辨率)外,我从未听说过任何不同的“内部表示”。你能提供一个你所指的参考吗?对内部表示的参考仅仅是计算机以二进制思考,而不是十进制思考;所有寄存器都是二进制的,不是十进制的。我想我误解了这个问题。。。。好吧,我将等待澄清,然后在必要时删除这个选项。虽然命令行选项是特定于GCC的,但问题不是这样的。我在68030和68040 Mac上使用了一个C编译器,它们具有“扩展”浮点数,这只是68881实现中的80位表示。
1.1111111111111799942818834097124636173248291015625
1.1111111111111802163264883347437717020511627197265625