【发布时间】:2017-09-21 14:41:54
【问题描述】:
我正在处理一些最初用 Visual C++ 编译的天文学代码。我在 32 位 VCL 平台上用 C++Builder XE4 编译它。
在这段代码中,有很多非常小的数字比较,都定义为double。下面的代码片段显示了 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)
...
【问题讨论】:
-
比较由硬件执行,独立于编译器。你也太担心这个了。例如,您甚至不能将 0.9972 完全表示为浮点值。如果你关心精度,为什么你只有4个有效数字。很容易混淆,进行模糊的思考,然后把
CompareMath扔到任何地方。不。尝试更好地理解。最后,第三季度令人震惊。不难找出 cmath 是什么以及 math.h 是什么。做一些研究。 -
对于第一季度,您需要查看实际编译的机器代码,以了解每个编译器实际使用哪些 CPU 指令来比较运行时的浮点值。
-
这并不能解决问题,但您不需要所有这些括号。
if (gamma > 0.9972 && fgamma < 1.543 + details.u)和第一个意思完全一样。
标签: c++ visual-c++ c++builder