【问题标题】:why is DBL_MAX inconsistent in C++ builder?为什么 C++ builder 中的 DBL_MAX 不一致?
【发布时间】:2014-02-03 10:53:39
【问题描述】:

我正在使用 Embarcadero RAD Studio 的评估版。对于静态库中的代码和主应用程序中的代码,我得到了不同的 DBL_MAX 值。

代码是

双倍 x = DBL_MAX;

在静态库中的代码中,x 被分配了不正确的值 ~1.449E-125。在主应用程序的代码中,x 被分配了正确的值 ~1.79E+308。

我的第一个想法是库代码#include 了一些错误地定义了值的东西,但我在它的任何源或标题中都找不到任何这样的定义。

我的另一个想法是std:_max_dble的初始化可能有问题,在DBL_MAX的定义中用到了。

为了重现该问题,我仅使用此源创建了一个 C++ Builder 静态库(在 Windows 7 上):

#include "Unit1.h"
#include <float.h>
double TestDblMax()
    {
    double x(DBL_MAX);
    return x;
    }

将库链接到 VCL 表单应用程序,并从表单构造函数中调用它,作为该构造函数中的第一条语句。结果是~1.449E-125。

【问题讨论】:

  • 你怎么知道值?尝试不分配它,而是直接从库中打印它,例如void printDblMax() { cout &lt;&lt; DBL_MAX; }。这可能是初始化顺序或链接错误的问题。
  • 我知道这些值,因为我在设置断点后在调试器中检查了它们。 (请注意,我没有先仔细检查我的事实就发布问题的习惯。)这些是函数中的自动堆栈变量,因此在函数执行时会被初始化。
  • @GrahamAsher:实际上,就标准而言,它们不需要在函数执行时进行初始化,但只有在可观察操作需要它们时才需要初始化 - 例如@987654323 @。即使这样,编译器也可能只是用std::cout &lt;&lt; DBL_MAX 替换它,因为不会有明显的区别—​​—调试器不算在内。
  • 我觉得你需要证明SSCCE有问题
  • 在调试版本中,变量的值是可靠的。此外,提到的值是在代码中使用的,我在实际使用时对其进行了检查。它具有不正确的值这一事实导致了一个错误,这就是我开始研究它的原因。该错误存在于一个大型商业库中,可以在其他平台上完美运行。

标签: c++ c++builder


【解决方案1】:

发现此旧帖子“未答复”。我使用 C++Builder 10.4 Sydney 做了一些测试。

如果我使用 C++ 经典编译器 - 使用静态库和 VCL 应用程序,我会得到与 DBL_MAX ~1.449E-125 相同的输出。

当我使用 Win32 进行测试(并关闭编译器选项“使用‘经典’Borland 编译器)以使用基于 Clang 的编译器时,我得到了 DBL_MAX ~1.79E+308 的正确结果。我还使用基于 Clang 的编译器进行了测试Win64 编译器,得到 DBL_MAX 的正确结果。

必须询问 C++ 编译器团队是否记得经典编译器和 DBL_MAX 的问题。

【讨论】:

    猜你喜欢
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多