C 打印出与原始十进制数相同的双精度数字
我希望能够打印出一个双精度数字s.t,它与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强制转换为双精度时,会出现舍入错误。返回到小数点,您将得到另一个舍入错误 有没有办法解决这个问题?解决这个问
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