我已经在互联网上搜索了几天,似乎无法找到公认的公式来确定我们可以以浮点格式存储的小数位数而不会出现截断错误。我最常遇到的答案是:
十进制精度=log₁₀(2ⁿ),其中n =尾数位数。
现在,这与我在CS本书中讨论的单点和双点格式所看到的一切都吻合。
但是,当我对照CS书中的示例进行检查时,数字并没有对齐。
示例使用8位格式和4位尾数。给定上面的公式,我应该只能存储精度不超过1.2位的十进制值。但是,根据该书(并尝试使用其他十进制值进行确认),我可以将4位尾数中的2.25之类的值无截断地存储。 0.0625也可以存储而没有错误。在这两种情况下,小数位数都超过了上式给出的1.2。
我不禁想知道我是否缺少某些东西。给定任意大小的尾数,是否可以确定小数精度?上面的公式与小于一定大小的尾数字段冲突吗?
对此事的任何澄清将不胜感激。
Danny D。
答案 0 :(得分:0)
一个通用的公式,用于确定我们可以以浮点格式存储的小数位数而不会出现截断错误。
研究FLT_DIG, DBL_DIG, LDBL_DIG
。它们是有效的小数位数(如 text 中所示),可以四舍五入为浮点类型,然后再返回float, double, long double
。
以二进制为基础并通用化为OP,请使用
floor((significant_bits - 1) log10(base))
使用base == 2
和一个significant_bits == 5
位符号(显式编码为4,暗含1),即为floor(1.204...)
或1
。
这意味着使用w.000 * 10 power 形式的十进制数字,所有组合的w
(1
-{{1 }})和9
(在最小/最大范围内)将成功从十进制文本到OP_s_Floating_point_type到十进制文本进行“往返”。
如果尝试以w.y00 * 10 power 的形式往返十进制文本,则对于power
的某种组合,将发生故障。这并不意味着该形式的所有组合都会失败,只是其中一些。
考虑尝试采用十进制文本“ 9.0”,“ 9.1”,“ 9.2”,...“ 9.9”,并将那10个转换为OP的FP格式。在9范围内,该格式仅支持9.0和9.5编码。因此,映射这10个数字将导致2个不同的FP数字。当然,将这2个转换回十进制形式只会得到2个不同的答案。这10个中有8个往返失败。
如果有什么我想念的。
给定任意大小的尾数,是否可以确定小数精度?
从上述公式得出的1值是最坏情况,而最坏情况是通常报告的十进制精度的数字。