【发布时间】:2019-01-31 22:41:14
【问题描述】:
我正在阅读 Stephen Prata 的 C Primer Plus,它引入浮点数的第一个方法是谈论它们如何精确到某个点。它特别指出“C 标准规定浮点数必须能够表示至少六个有效数字......浮点数必须准确地表示前六个数字,例如 33.333333”
这对我来说很奇怪,因为它听起来像是浮点数精确到六位数,但事实并非如此。 1.4 存储为 1.39999... 等等。你仍然有错误。
那么究竟提供了什么?是否有一个数字应该有多准确的截止值?
在 C 中,您不能在浮点数中存储超过六个有效数字而不会收到编译器警告,但为什么呢?如果你要超过六位数,它似乎也一样准确。
关于下溢和次正规数的部分使这更加令人困惑。当您有一个浮点数可以是最小的数字并将其除以 10 时,您得到的错误似乎并不正常?它们似乎只是上面提到的常规舍入误差。
那么为什么书上说浮点数精确到六位数,而次正态与常规舍入误差有何不同?
【问题讨论】:
-
C 标准的什么地方是这么说的? port70.net/~nsz/c/c11/n1570.html
-
例子有8位有效数字
-
33.333333 不是我写的。直接出书了。它暗示 33.3333 将被保存,其余部分将被截断。
-
@GovindParmar: C 2018 5.2.4.2.2 12 表示
FLT_DIG必须至少为 6,它是小数位数,q,这样任何带有 q 十进制数字的浮点数(例如输入中的“1.40000e0”)都可以四舍五入为带有 p 基数 b 个数字(它指的是内部格式之一,例如float、double或long double),然后再次返回而不更改 q 十进制数字。
标签: c floating-point