我遇到了两种不同的浮点数精度公式.
⌊(N-1)log 10(2)⌋= 6位小数(单精度)
和
N log 10(2)≈7.225十进制数字(单精度)
其中N = 24个有效位(单精度)
第一个公式位于由W. Kahan教授撰写的" IEEE标准754二进制浮点运算 " 第4页的顶部.
第二个公式可以在维基百科文章" 单精度浮点格式 "的IEEE 754单精度二进制浮点格式:binary32下找到.
对于第一个公式,W.Kahan教授说
如果十进制字符串最多为6 sig.(分解). 转换为Single,然后转换回相同数量的sig.dec.,那么最后的字符串应该与原始字符串匹配.
对于第二个公式,维基百科说
...总精度为24位(相当于log 10(2 24)≈7.225十进制数字).
两个公式(6和7.225十进制数字)的结果是不同的,我希望它们是相同的,因为我假设它们都是为了表示最有效的十进制数字,可以转换为浮点二进制,然后转换回来十进制,其开头的有效十进制数字相同.
为什么这两个数字不同,什么是最重要的十进制数字精度可以转换为二进制并返回到十进制而不会失去重要性?
floating-point binary decimal significant-digits floating-point-precision
我遇到了一个问题,显示floatPython中的值,从外部数据源加载
(它们是32位浮点数,但这也适用于较低精度的浮点数).
(如果它很重要 - 这些值是由C/C++中的人类输入的,所以与任意计算值不同,可能无法忽略与圆数的偏差,但不能忽略,因为这些值可能是常数,例如或乘以常量).M_PI
由于CPython使用更高的精度(通常为64位),因此作为较低精度浮点输入的值可能会repr()显示32位浮点数的精度损失,其中64位浮点数将显示舍入值.
例如:
# Examples of 32bit float's displayed as 64bit floats in CPython.
0.0005 -> 0.0005000000237487257
0.025 -> 0.02500000037252903
0.04 -> 0.03999999910593033
0.05 -> 0.05000000074505806
0.3 -> 0.30000001192092896
0.98 -> 0.9800000190734863
1.2 -> 1.2000000476837158
4096.3 -> 4096.2998046875
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,简单地将值舍入为某些任意精度都可以工作,但可能不正确,因为它可能会丢失重要值,例如:0.00000001.
可以通过打印转换为32位浮点的浮点来显示此示例.
def as_float_32(f):
from struct import pack, unpack
return unpack("f", pack("f", f))[0]
print(0.025) # --> 0.025
print(as_float_32(0.025)) # --> 0.02500000037252903
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
什么是最有效和直接的方式来获得32位浮点的原始表示,而不做假设或失去精度?
换句话说,如果我有一个包含32位浮点数据的数据源,那么这些数据源最初是由人类作为圆值输入的(上面的示例),但是将它们表示为更高的精度值会暴露出该值为32位浮点数是一个近似的原始值.
我想颠倒这个过程,从32位浮点数据中获取回 …