Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 打印出与原始十进制数相同的双精度数字_C_Precision - Fatal编程技术网

C 打印出与原始十进制数相同的双精度数字

C 打印出与原始十进制数相同的双精度数字,c,precision,C,Precision,我希望能够打印出一个双精度数字s.t,它与C语言中的原始十进制数字相同 char buf[1000]; double d = ______; 如果是双人,我愿意 snprintf(buf, sizeof(buf), "%.17g", .1); 但它会在执行时打印出来:printf(“%s”,buf) 最后一个1为舍入错误 如果您试图表示.1,它将输出最接近的十进制表示法双精度值。将.1强制转换为双精度时,会出现舍入错误。返回到小数点,您将得到另一个舍入错误 有没有办法解决这个问题?解决这个问

我希望能够打印出一个双精度数字s.t,它与C语言中的原始十进制数字相同

char buf[1000];
double d = ______;
如果是双人,我愿意

snprintf(buf, sizeof(buf), "%.17g", .1);
但它会在执行时打印出来:
printf(“%s”,buf)

最后一个
1
为舍入错误

如果您试图表示
.1
,它将输出最接近的十进制表示法双精度值。将
.1
强制转换为双精度时,会出现舍入错误。返回到小数点,您将得到另一个舍入错误

有没有办法解决这个问题?

解决这个问题的“标准”解决方案并不完美:对所有浮点常量使用十六进制表示法,而不是十进制表示法。不幸的是,它们看起来像人类难以消化的东西。但是有了它们,你就可以保证写出来和读回给你完全相同的价值


如果您有至少实现C99的C库,则来自标准C库
strtod
printf
(格式为
%a
)和类似工具的工具支持此功能。使用时必须注意的一点是,
printf
的小数点与
locale
相关。因此,如果您的语言环境中有一个
,那么您必须确保使用相同的
语言环境进行写和读,通常情况下,您试图做的事情是不可能的。浮点值使用二进制表示,而许多具有终止十进制表示的值没有精确的二进制表示

从根本上说,如果希望保留十进制表示,那么应该使用将该值表示为十进制的数据类型

也许值得指出Python用于显示浮点值的方法。Python显示最短的十进制表示形式,其最近的浮点值就是正在显示的值

0.1
为例,该值不能用二进制浮点精确表示。因此使用最接近的浮点值。当您要求该二进制值的十进制表示形式时,Python运行库确定
0.1
是最短的表示形式,因此
float('0.1')==value


如果这种方法对您有用,那么您应该研究一下:

您是在询问IEEE-754双精度浮点格式的局限性,还是询问如何解决这一问题,现在还不清楚。请澄清。@DavidC.Rankin您能否向我解释IEEE-754双精度浮点格式的局限性以及如何解决上述问题。我真的很想know@psyco限制具有误导性。二进制表示法意味着许多具有精确十进制表示法的值无法准确表示。然而,这是通过设计实现的,二进制浮点有很多优点。“对于它的预期用途,我认为不可能有更好的设计。”psyco告诉另一位David和Jens,并且已经非常雄辩地解释了这一点。我要补充的唯一一点是,您面临的问题是,用于描述所有可能的浮点值的位数有限。IEEE-754双精度格式使用1符号位,11位表示指数,64位中只剩下52位表示尾数或有效位。根本没有足够的位来唯一地描述所有可能的浮点值。的可能重复
0.10000000000000001