c++ - 机器精度以及 double 类型的最大值和最小值

标签 c++ c

(1)我遇到过几种将epsilon添加到非负变量以保证非零值的情况。所以我想知道为什么不添加数据类型可以代表的最小值而不是epsilon?这两个可以解决的区别问题是什么?

(2)我还注意到, double 类型的最大值的倒数大于其最小值,而其最小值的倒数是inf,远大于其最大值。计算最大值和最小值的倒数是否有用?

(3)对于很小的 double 正数,要计算其倒数,当倒数开始没有意义时,它的大小是多少?设定互惠上限是否更好?界限是多少?

感谢致敬

最佳答案

您需要了解如何在CPU中表示浮点数。在数据类型中,为符号保留1位,即无论它是正数还是负数(是的,您可以在浮点数中使用正负0,),然后为有效数保留若干位(或尾数),这些是浮点数的有效数字,最后为指数保留了一些位数。现在浮点数的值为:

-1 ^符号*有效位数* 2 ^指数

  • 这意味着最小的数字是一个很小的值,即具有最小指数的smalles有意义数。但是,舍入误差要大得多,并且取决于数字的大小,即具有给定指数的最小数字。 ε是1.0与下一个可表示的较大值之间的差。这就是在代码中使用epsilon的原因,该代码对于舍入错误具有鲁棒性,如果正确执行,实际上应该使用处理的数字的大小来缩放epsilon。通常,最小的可表示值实际上并没有任何重大用途。
  • 您将看到规范化最小值和非规范化最小值之间的差异。问题在于,由于使用了有效数的方式,可以使负指数大于正数,例如,有效位数的位模式除最后一位为1之外,全为零,则该指数有效降低有效位数。为了最大程度地执行此操作,即使将有效位数设置为所有有效位数,有效指数仍将仅是给定的指数。即,考虑0.000001e-10与9.999999e + 10之间的差异,第一个远小于第二个大。第一个实际上是1e-16,第二个大约是1e + 11。
  • 当然取决于浮点数的精度。在 double 情况下,最大值和下一个较小值之间的差已经很大(沿10 ^ 292行),因此舍入误差将非常大。如前所述,如果值太小,您将直接获得inf。确实,没有严格的答案,这完全取决于您所需数字的精度。考虑到舍入误差约为epsilon *量级,(1 / epsilon)的倒数已经具有大约1.0的舍入误差,如果您需要精确到1e-3的数字,那么甚至epsilon也将太大而无法除以。

  • 有关一些背景信息,请参见IEEE754Machine epsilon上的这些维基百科页面。

    关于c++ - 机器精度以及 double 类型的最大值和最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2185953/

    相关文章:

    c++ - C响应中应在何处使用assert()。 C++?

    c++ - 头文件包含循环和多重定义

    c++ - XCode 4.5.2 的 CRTP 错误 - 解析问题,预期的表达式

    c - 输入 'yes' 命令时 strcmp 不会停止

    c - fwprintf 不输出宽字符

    c++ - _commit 问题与 fd()

    c++ - 为什么我不能将静态库包含到 cpp 文件中?

    为结构分配内存的正确方法?

    c - 没有得到正确答案

    c - 如何让我的脚本循环并根据命令退出?