2011-01-05 65 views
6

如何在C++中使用涉及有效數字的數學?我希望這樣能夠正確處理來自化學和物理實驗的測量數據。例如:65/5 = 10.我需要擺脫不需要的小數位,並用0代替一些數字。C++有效數字

謝謝!

+7

5,5.0 5.00000000是在計算機的表示相同。你在說如何*顯示2位有效數字的結果嗎? – kennytm 2011-01-05 18:00:02

+0

是的,我是。我會編輯我的帖子來說。 – joshim5 2011-01-05 18:01:12

+1

我認爲他的意思是在3.5 * 1.00 * pi的情況下,他希望使用3.5 * 1.0 * 3.1來計算(除非我感到困惑) – 2011-01-05 18:02:13

回答

-1

那麼有good math libraries in math.h

而且存儲花車您的數字,雙打或雙打長將允許進行更精確的操作。

浮游物提供7位有效數字,而雙打提供16位有效數字。

source

而且打印出一般人使用_snprintf或printf和你可以格式化的雙打,當浮到你想要像精度:

float精度

的printf(「價值%8.2f「,floatVariable);

這是說你需要8個字符的總 領域,8個 字符內的最後2將舉行 小數部分。 (buffer,sizeof(buffer),「Value%.2f」,floatVariable);}}

上面的例子 請求最小字段寬度和 最後兩個字符是保存 的小數部分。

+5

這些是「小數點後的數字」,而不是[有效數字](https://en.wikipedia.org/wiki/Significant_figures)。對於科學家和工程師來說,兩者之間存在着非常重要的差異。 – bdesham 2015-06-17 13:59:12

6

這應該得到你所需要的:

std::cout.precision(x); // x would be the number of significant figures to output 
+0

我會寫:cout.precision(2)< <5.34343;如果我想顯示5.3? – joshim5 2011-01-05 18:03:06

+0

正確 - 這裏有它的文檔:http://www.cplusplus.com/reference/iostream/ios_base/precision/ – 2011-01-05 18:05:03

1

因爲顯著數字是十進制的概念和計算機說話的二進制這是很難的。你可以使用十進制數類(我不知道任何),或使用boost::interval,這是你最想達到的。

+0

+1用於提示區間算術,儘管它可能在這裏過度殺傷,它仍然是值得了解的東西:) – 2011-01-05 21:21:35

4

這可能不是最有效的方法,但可以創建自定義數據類型。

class SigFigFloat 
{ 
    SigFigFloat(vector<short> digits, int decimalIndex, bool negative); 
    SigFigFloat operator+(const SigFigFloat &value); 
    SigFigFloat operator-(const SigFigFloat &value); 
    //etc... 


} 

它可以是一個大量的工作,但如果你實現這個權利,它可以代表一個非常靈活的方式,做與SIG的無花果計算。

+0

如果我這樣做,我不會追蹤有意義的數字,我會追蹤誤差範圍,而不僅僅是有效數字的數量。這將允許我使用123±0.2或123±0.7等數字,而有效數字只允許123±0.5這樣的數字 – Steve 2017-01-13 20:42:04

1

這取決於你如何顯示它們。如果您使用的是printf-family,則可以設置精度(sprintf(buffer, "%.2f", myfloat))。如果您使用的是ostreams,則可以調用精度函數來設置小數位數。如果您正在尋找更加科學的方法,您必須編寫一個自定義函數,根據浮點數的當前值確定精度。

0

這裏是一個快速的C++ 11的解決方案,爲我工作:

int sig_figs = 3; 
double number = 1562.654478; 

std::cout << "original number:" << number << std::endl; 

number = ([number](int number_of_sig_figs)->double{ 
    std::stringstream lStream; 
    lStream << std::setprecision(number_of_sig_figs) << number; 
    return std::stod(lStream.str()); 
})(sig_figs); 

std::cout << "rounded number:" << number << std::endl;