c++ - 比较 VS C++ 与 C++ Builder 中的 float

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

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

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

  1. C++Builder 比较 float 和 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)
      ...

最佳答案

简答

  1. 没有

  2. 取决于双线程环境中的编译器设置。

  3. 是的,但请参阅#2

长答案

编译器设置

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

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

线程环境

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

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

关于c++ - 比较 VS C++ 与 C++ Builder 中的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46346925/

相关文章:

c++ - 将 C++ 代码转换为 SPIM 程序集

c++ - 无重复数的随机数生成器

c++ - 解析以 UTF-8 编码的 XML

c++ - boolean 值在分配时应该被截断为 true 还是 false?

c++ - 带有 MFC 和静态链接的 DLL

delphi - TWebBrowser 和 ProcessMessages

c++ - C++ Builder XE4 中的结构声明

C++使用指针简单自减(疑惑)

c++ - 在另一个 VS 项目中引用函数模板的显式实例化时出现 LNK2019 错误

c++ - 有什么方法可以在 DelphiInterface 上实现 dynamic_cast 以获得底层对象类?