2017-09-21 72 views
0

我正在使用最初在Visual C++中編譯的一些天文代碼。我正在使用32位VCL平臺上的C++ Builder XE4編譯它。VS C++與C++ Builder比較浮點數

在此代碼中,對於非常小的數字有很多比較,全部定義爲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) 
     ... 
+5

比較是由硬件執行的,並且獨立於編譯器。你也擔心這太多了。例如,你甚至不能完全表示0.9972作爲浮點值。如果你關心精度,你爲什麼只有4位有效數字。很容易混淆,搞模糊思考,並且拋棄所有的'CompareMath'。別。試着更好地理解。最後,Q3是驚人的。不難發現什麼是cmath,什麼math.h是。做一些研究。 –

+0

對於Q1,您需要查看實際編譯的機器代碼,以查看每個編譯器實際使用哪些CPU指令來比較運行時的浮點值。 –

+0

這並沒有解決這個問題,但你並不需要所有的括號。 '如果(gamma> 0.9972 && fgamma <1.543 + details.u)'意思與第一個完全相同。 –

回答

1

簡短的回答

  1. 沒有

  2. 取決於兩個+線程的環境中編譯器設置。

  3. 是的,但看到#2

龍答案

編譯器設置

最重要的編譯器設置爲目標指令集。根據設置,雙精度浮點代碼可以編譯爲傳統x87指令,SSE2或更高版本(SSE 4,AVX等) 有趣的是,有些編譯器會將某些設置編譯爲兩者。在同一個程序中,他們可以使用x87做一件事,使用SSE做其他事情。

還有其他相關的編譯器開關,例如/fp在Visual C++

線程環境

對於的x87碼,線程狀態的有趣的部分是的x87 FPU控制寄存器。對於Visual C++,請參閱_controlfp_s API

CPU的SSE組件使用類似的東西,MxCsr register