【问题标题】:Is DBL_MIN the smallest positive double?DBL_MIN 是最小的正双精度数吗?
【发布时间】:2016-09-28 12:00:46
【问题描述】:

问: DBL_MIN 是最小的正双精度数吗?

下面的代码似乎没有回答这个问题。但如果这是真的,那么 DBL_MIN 是如何定义的,它的用途或目的是什么。

平台:Windows7 和 Visual Studio 2013

double next_to_zero = std::nextafter(0.0,DBL_MIN);
bool b =  DBL_MIN <= next_to_zero;
std::cout << std::boolalpha 
          << "is dbl_min the smallest representable double? "
          << b << '\n';

std::cout << std::setprecision(56)
          << "dbl_min = " << DBL_MIN << '\n'
          << "next to zero = " << next_to_zero;

输出:

dbl_min 是最小的可表示双精度数吗?假的

dbl_min = 2.2250738585072013830902327173324040642192159804623318306e-308

零旁边 = 4.9406564584124654417656879286822137236505980261432476443e-324

【问题讨论】:

标签: c++ language-lawyer numeric


【解决方案1】:

我将这个答案限制为 IEEE754 浮点,这可能是不必要的。

DBL_MIN 不允许为次正常数。

但是std::nextafter 被允许返回一个次正常的数。

因此后者的返回值可能小于DBL_MIN

更多详情见https://en.wikipedia.org/wiki/Denormal_number

【讨论】:

  • 那么,DBL_MIN 是最小的正常双精度值吗?
  • 是的,就是这个。
  • 另外值得注意的是,在 Intel 上,浮点寄存器是 80 位长的 double,并且可以保存更多的值。
  • "一些系统在硬件中处理非正规值的方式与正常值相同。其他系统将非正规值的处理留给系统软件,仅在硬件中处理正常值和零。在软件中处理非正规值总是会导致性能显着下降。”
  • “当非正规值完全在硬件中计算时,存在实现技术以允许它们以与正常数字相当的速度进行处理;但是,在许多现代处理器上,计算速度显着降低;在极端情况下,涉及非正规操作数的指令运行速度可能会慢 100 倍。这种速度差异可能会带来安全风险。...有些应用程序需要包含代码以避免非正规数,以保持准确性,或避免在一些处理器。”
【解决方案2】:

DBL_MIN 是最小的正双精度吗?

不一定。
DBL_MIN 是最小的正正常double

DBL_TRUE_MIN 是最小的正数double(C++17 起)。当double 支持subnormals时,它将小于DBL_MIN

【讨论】:

  • 不过,我在任何地方都看不到 DBL_TRUE_MIN 的定义。
  • @AlexisWilke DBL_TRUE_MIN --> minimum positive value of double
  • 啊。它在 Ubuntu 20.04 (g++ v9.3) 上可用。它在 18.04 中尚不可用。
猜你喜欢
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多