比方說,我有一個輸入1.251564
。我怎樣才能找到雙數的數量?
我怎麼能找到多少元素"."
後有一個輸出如下:
int numFloating;
// code to go here that leads to
// numFloating == 6
附:對不起,不提供任何代碼,我只是不知道應該怎樣實現:(你的答案
謝謝!
比方說,我有一個輸入1.251564
。我怎樣才能找到雙數的數量?
我怎麼能找到多少元素"."
後有一個輸出如下:
int numFloating;
// code to go here that leads to
// numFloating == 6
附:對不起,不提供任何代碼,我只是不知道應該怎樣實現:(你的答案
謝謝!
這不會結束。問題是,有時在用二進制表示數字時存在浮點錯誤(這是您的計算機所做的)。 例如,當添加1/3 + 1/3 + 1/3時,您可能會得到0.999999 ...並且小數位數變化很大。
拉維已提供給計算它的好方法,所以我將提供一個不同:
double number = 0; // should be equal to the number you want to check
int numFloating = 0;
while ((double)(int)number != number){
number *= 10;
numFloating++;
}
號碼是保存要檢查小數位數雙變量。
謝謝,請你澄清一下「數字」是什麼?輸入? – SuTron 2014-11-22 11:08:16
'double number = 1.251564',this code results in'numFloating == 0' – 2014-11-22 11:39:37
這甚至在原則上也不起作用,因爲乘以10並不確切。 – 2014-11-22 11:41:04
簡單的方法是將其存儲到字符串。
std::string str("1.1234");
size_t length = str.length();
size_t found = str.find('.', 0);
size_t count = length-found-1;
int finallyGotTheCount = static_cast<int>(count);
如果你有一個小數比方說0.1234
反覆乘以10,扔掉數量的整數部分,直到你得到零的步數將小數位數例如:。
.1234 * 10 = 1.234
.234 * 10 = 2.34
.34 * 10 = 3.4
.4 * 10 = 4.0
但是,如果您有一個像「1.199999999」一樣的「浮動」數字,就會出現問題。
int numFloating = 0;
double orgin = 1.251564;
double value = orgin - floor(orgin);
while(value == 0)
{
value *= 10;
value = value - floor(value);
numFloating ++;
}
通過使用此代碼有時候答案是錯誤的。 exp:浮點數爲零等於(2^31)-1。 顯然輸出取決於它如何真正存儲。
謝謝,應該適合我,因爲我不需要轉換它:) – SuTron 2014-11-22 11:05:56
讓我們考慮你的號碼,1.251564
。當您將其存儲在double
中時,它將以二進制IEEE754格式存儲。你可能會發現這個數字是不可表示的。所以,讓我們檢查這個數字。 closest representable雙是:
1.25156 39999 99999 89880 45035 73046 53152 82344 81811 52343 75
這可能是作爲一個驚喜給你。小數點後面有52位十進制數字。
您需要從中獲得的教訓是,如果您想提出有關小數表示的問題,則需要使用十進制數據類型而不是double
。一旦你能夠準確地代表價值,那麼你將能夠以符合你的期望的方式推理它。
謝謝,很高興知道。我想解決的問題是看素數分數形式的雙數是否有奇數分母。 – SuTron 2014-11-22 11:13:20
這是一個不錯的鏈接。我愛0.1如何不是真的0.1 :) – fredoverflow 2014-11-22 11:13:30
@MikaelEgibyan然後,你爲什麼不問「如何確定素數分數形式的雙數有奇數分母」? – fredoverflow 2014-11-22 11:14:17
點數在1/3後有多少個元素?在數學上來說,在小數點後面,有一個無限的3點。我不確定這個數字如果乘以10(例如)會如何反應,顯然,您不能存儲數字無窮大。這不是一個簡單的問題,因爲浮點值的表示和操作不允許這樣做。 – 2014-11-22 11:00:32
讓我們考慮我們有雙重類型 - 這意味着我們有最多16個點後的元素。 – SuTron 2014-11-22 11:02:03
我恢復了編輯。當你有一個新的問題要問,你需要問這個問題,一個新的問題。 – 2014-11-22 11:20:55