当前位置: 首页 > 知识库问答 >
问题:

浮点、双打和长双打是否保证最低精度?

柳星晖
2023-03-14

从我之前的问题“浮点精度是可变的还是不变的?”我收到一个回复说,

C提供DBL_DIG、DBL_DECIMAL_DIG及其浮点和长双精度对应项。DBL_DIG表示最小相对小数精度。DBL_DECIMAL_DIG可以看作是最大的相对十进制精度。

我查了这些宏指令。它们位于标题< code >中

以下是最小精度值的宏。

FLT_DIG6或更大

DBL_DIG10或更大

LDBL_DIG10或更大

如果我以表面值接受这些宏,我会假设float的最小十进制精度为6,而doubleand 则最小十进制精确度为10。然而,作为一个大孩子,我知道有些事情可能太好了,不可能是真的。

因此,我想知道。浮点数、双精度数和长双精度数有保证的最小十进制精度吗,这个最小十进制精度是上面给出的宏的值吗?

如果没有,为什么?

注:假设我们使用的是编程语言C。

共有3个答案

卜泓
2023-03-14

具体来说。由于我的编译器使用IEEE 754标准,因此对于float,我的十进制数字的精度保证为6到9个有效十进制数字,对于 double15到17个有效十进数字。此外,由于我的编译器上的 长doubledouble的大小相同,因此它也有15到17个有效的十进制数字。

这些范围可以从IEEE 754单精度二进制浮点格式验证:二进制32和IEEE 754双精度二进制浮点格式:二进制64。

弓明亮
2023-03-14

浮点数、双精度值和长双精度是否保证最小十进制精度,此最小十进制精度是否为上面给出的宏的值?

我在标准中找不到任何保证十进制精度的最小值的地方。

以下引用 http://en.cppreference.com/w/cpp/types/numeric_limits/digits10 可能会有所帮助:

例子

8 位二进制类型可以精确地表示任何两位数的十进制数,但不能表示 3 位十进制数 256..999。8 位类型的数字 10 值为 2 (8 * std::log10(2) 为 2.41)

标准的32位IEEE 754浮点类型有一个24位小数部分(23位写入,一个隐含),这可能表明它可以表示7位小数(24*std::log10(2)为7.22),但相对舍入误差是不均匀的,一些具有7位十进制数字的浮点值无法转换为32位浮点并返回:最小的正例是8.589973e9,它在往返后变成8.589974e9。这些舍入误差在表示法中不能超过一位,digits10计算为(24-1)*std::log10(2)

但是,C 标准指定了需要支持的最小值。从 C 标准:

5.2.4.2.2浮动类型的特征

...

9 以下列表中给出的值应替换为具有实现定义的值的常量表达式,这些值在大小(绝对值)上大于或等于所示值,并具有相同的符号

...

--十进制位数q,这样任何具有q个十进制数字的浮点数都可以四舍五入为具有p基数b位的浮点数,然后再返回而不更改q个十进制数字,

...

< code > FLT _迪格6 < br > < code > DBL _迪格10 < br > < code > LDBL _迪格10

尉迟韬
2023-03-14

如果std::numeric_limits

否则(无论如何),符号的最小允许值,如DBL_DIG,由C标准规定,对于库来说,该标准无可争议地“通过引用纳入[C]国际标准”,如C 11§17.5.1.5/1所引用。

编辑:正如TC在这里的评论中指出的,

"

不幸的是,对于正式的观点来说,首先,C11的引用来自第17.5节,这只是信息性的,而不是规范性的。其次,C标准中的措辞,即指定的值是最小值,也在一个章节(C99标准的附件E)中,这是信息性的,而不是规范性的。因此,虽然它可以被视为实践中的保证,但它不是正式的保证。

< del >一个强有力的迹象表明,实际上< code>float的最小精度是6位十进制数字,任何实现都不会给出更少的数字:

输出操作默认为精度6,这是标准文本。

免责声明:可能是有额外的措辞提供了我没有注意到的保证。不太可能,但有可能。

 类似资料:
  • 问题内容: 我正在制作一个Android Java程序,该程序从用户处获取双倍值。如果我在计算机上运行该程序,则由于我的计算机的语言环境为EN_UK,因此运行良好。但是,当我在具有FI_FI语言环境的手机上运行它时,它将无法工作。我知道原因:在英国,人们使用点作为小数点分隔符,但在芬兰,小数点分隔符是逗号。 当我使用逗号时,它说。 如何使它们与逗号和点都兼容? 问题答案: 使用DecimalFor

  • 我不明白为什么浮点值与双精度值不同。从下面的示例来看,对于相同的操作,float 提供的结果似乎与双精度型不同: 输出: 你能解释一下float和double之间的区别吗?

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 这是简单的方法。请勿将regex用于内置类型。

  • 问题内容: 如何使用正则表达式从字符串中提取双精度值。 问题答案: 是简单的方法。请勿将regex用于内置类型。

  • 问题内容: 是否有比浮点精度更好的数据类型? 问题答案: 小数数据类型 与基于硬件的二进制浮点数不同,十进制模块具有用户可更改的精度(默认为28位),可以与给定问题所需的精度一样大。 如果您对性能问题感到困扰,请查看GMPY

  • 本文向大家介绍C#浮点,双精度,十进制,包括了C#浮点,双精度,十进制的使用技巧和注意事项,需要的朋友参考一下 示例 浮动 float是.NET数据类型的别名System.Single。它允许存储IEEE 754单精度浮点数。存在此数据类型mscorlib.dll,每个C#项目在创建它们时都会隐式引用该数据类型。 大致范围:-3.4×10 38至3.4×10 38 十进制精度:6-9个有效数字 记