比较 VS C++ 与 C++ Builder 中的浮点数
Comparing floating point numbers in VS C++ vs C++ Builder
我正在处理一些最初用 Visual C++ 编译的天文学代码。我在 32 位 VCL 平台上用 C++Builder XE4 编译它。
在这段代码中,有很多比较非常小的数字,都定义为double
。下面的代码片段显示了 headers 和 VC++ 代码中的一些示例比较。我需要在 VC++ 和 C++ Builder 中得到相同的结果,所以我有一些关于比较浮点数的问题:
C++Builder比较浮点数和VC++一样吗?
在C++Builder中,是否需要使用CompareValue(double, double)
函数重写代码?
如果我从 #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)
...
简答
否
取决于双线程环境下的编译器设置。
是的,但请参阅#2
长答案
编译器设置
最重要的编译器设置是目标指令集。根据设置,双精度浮点代码可以编译为旧版 x87 指令、SSE2 或更高版本(SSE 4、AVX 等)
有趣的是,一些具有某些设置的编译器会编译成两者。在同一个程序中,他们可能将 x87 用于一件事,将 SSE 用于另一件事。
还有其他相关的编译器开关,例如/fp
在 Visual C++ 中
线程环境
对于 x87 代码,线程状态中有趣的部分是 x87 FPU 控制寄存器。对于 Visual C++,请参阅 _controlfp_s API。
CPU 的 SSE 组件使用类似的东西,MxCsr register。
我正在处理一些最初用 Visual C++ 编译的天文学代码。我在 32 位 VCL 平台上用 C++Builder XE4 编译它。
在这段代码中,有很多比较非常小的数字,都定义为double
。下面的代码片段显示了 headers 和 VC++ 代码中的一些示例比较。我需要在 VC++ 和 C++ Builder 中得到相同的结果,所以我有一些关于比较浮点数的问题:
C++Builder比较浮点数和VC++一样吗?
在C++Builder中,是否需要使用
CompareValue(double, double)
函数重写代码?如果我从
#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)
...
简答
否
取决于双线程环境下的编译器设置。
是的,但请参阅#2
长答案
编译器设置
最重要的编译器设置是目标指令集。根据设置,双精度浮点代码可以编译为旧版 x87 指令、SSE2 或更高版本(SSE 4、AVX 等) 有趣的是,一些具有某些设置的编译器会编译成两者。在同一个程序中,他们可能将 x87 用于一件事,将 SSE 用于另一件事。
还有其他相关的编译器开关,例如/fp
在 Visual C++ 中
线程环境
对于 x87 代码,线程状态中有趣的部分是 x87 FPU 控制寄存器。对于 Visual C++,请参阅 _controlfp_s API。
CPU 的 SSE 组件使用类似的东西,MxCsr register。