【问题标题】:Comparing floating point numbers in VS C++ vs C++ Builder比较 VS C++ 与 C++ Builder 中的浮点数
【发布时间】:2017-09-21 14:41:54
【问题描述】:

我正在处理一些最初用 Visual C++ 编译的天文学代码。我在 32 位 VCL 平台上用 C++Builder XE4 编译它。

在这段代码中,有很多非常小的数字比较,都定义为double。下面的代码片段显示了 VC++ 代码的标题和一些示例比较。我需要 VC++ 和 C++ Builder 中的结果相同,所以我对比较浮点数有一些疑问:

  1. C++Builder 是否像 VC++ 一样比较浮点数?

  2. 在 C++Builder 中,是否需要使用 CompareValue(double, double) 函数重写代码?

  3. 如果我从#include <cmath> 切换到使用#include <math.h>#include <math.hpp> 会得到相同的结果吗?

在两个编译器中获得相同结果的任何建议都会有所帮助。

#include "stdafx.h"
#include <cmath>
#include <cassert>
using namespace std;

...
else if ((fgamma > 0.9972) && (fgamma < (1.5433 + details.u)))
{
  if ((fgamma > 0.9972) && (fgamma < (0.9972 + fabs(details.u))))
  {
    if (details.u < 0)
      ...

【问题讨论】:

  • 比较由硬件执行,独立于编译器。你也太担心这个了。例如,您甚至不能将 0.9972 完全表示为浮点值。如果你关心精度,为什么你只有4个有效数字。很容易混淆,进行模糊的思考,然后把CompareMath 扔到任何地方。不。尝试更好地理解。最后,第三季度令人震惊。不难找出 cmath 是什么以及 math.h 是什么。做一些研究。
  • 对于第一季度,您需要查看实际编译的机器代码,以了解每个编译器实际使用哪些 CPU 指令来比较运行时的浮点值。
  • 这并不能解决问题,但您不需要所有这些括号。 if (gamma &gt; 0.9972 &amp;&amp; fgamma &lt; 1.543 + details.u) 和第一个意思完全一样。

标签: c++ visual-c++ c++builder


【解决方案1】:

简答

  1. 取决于两个+线程环境中的编译器设置。

  2. 是的,但请参阅 #2

长答案

编译器设置

最重要的编译器设置是目标指令集。根据设置,双精度浮点代码可以编译为旧版 x87 指令、SSE2 或更高版本(SSE 4、AVX 等) 有趣的是,一些具有某些设置的编译器可以同时编译到两者中。在同一个程序中,他们可能将 x87 用于一件事,将 SSE 用于其他事情。

还有其他相关的编译器开关,例如/fp 在 Visual C++ 中

线程环境

对于 x87 代码,线程状态的有趣部分是 x87 FPU 控制寄存器。对于 Visual C++,请参阅_controlfp_s API

CPU 的 SSE 组件使用类似的东西,MxCsr register

【讨论】:

    猜你喜欢
    • 2011-10-23
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多