视觉比较C 与C 构建器中的浮点数

visual Comparing floating point numbers in VS C++ vs C++ Builder

本文关键字:浮点数 构建 比较 视觉      更新时间:2023-10-16

我正在使用最初在Visual C 中编译的天文学代码。我正在32位VCL平台上的C 构建器XE4中编译它。

在此代码中,对于非常小的数字进行了很多比较,所有比较都定义为double。下面的代码剪辑显示了VC 代码中的一些示例比较。我需要在VC 和C 构建器中相同的结果,因此我对比较浮点数数字有一些疑问:

  1. C 构建器是否比较浮点数与VC 相同?

  2. 在C 构建器中,我是否需要使用CompareValue(double, double)函数重写代码?

  3. 如果我从#include <cmath>切换到使用#include <math.h>#include <math.hpp>

  4. ,我会得到相同的结果

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

#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. 是的,但请参见#2

长答案

编译器设置

最重要的编译器设置是目标指令集。根据设置的不同,双精度浮点代码可以编译到传统X87指令中,或更高(SSE 4,AVX等)有趣的是,一些具有一些设置的编译器将两者都编译为两者。在同一程序中,他们可以将X87用于一件事,而SSE则用于其他方面。

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

线程环境

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

CPU的SSE组件使用类似的东西,MXCSR寄存器。