我有一個輸入浮點值是0.0f < =值< 1.0f(注意不到一個)。在C++中找到最接近的小於特定整數值的浮點值?
將此值乘以較大範圍時,浮點精度自然會下降,這意味着該值可能會超出等效範圍。
例如,如果我開始了與一個值,如:
0.99999983534521f
然後乘以100,我得到:
100.000000000000f
這很好,但然後如何將浮點表示降低到最接近的浮點值仍小於100?
我發現這個小手冊招:
union test
{
int integer;
float floating;
};
test value;
value.floating = 1.0f;
printf("%x\n", value.integer);
然後我採取的十六進制值,並通過一個十六進制數字減少它,然後將其設置明確的,像這樣:
unsigned int almost_one = 0x3f7fffff;
float value = 1.0f;
if (value >= 1.0f) std::memcpy(&value, &almost_one, sizeof(float));
,對於運作良好這個具體的價值,但是我可以使用更通用的方法嗎?
我希望有一個神奇的指令,我不知道,我可以用它來實現這一點!
編輯:偉大的答案在這裏,std :: nextafter看起來像我以後。不幸的是我還不能使用C++ 11數學庫,所以這對我不起作用。爲了節省複雜的事情,我將用C++ 11標記這個問題並接受Mike的答案。
我已經開始爲C++ 03的新問題:Alternative to C++11's std::nextafter and std::nexttoward for C++03?
這看起來像未定義的行爲... – Sebivor 2013-05-01 16:44:42
你想要達到什麼目的?如果你的結果恰好是100.0f那麼這是最接近實際結果的數字。將尾數減1只會讓你的結果不那麼敏感。 – typ1232 2013-05-01 16:46:11
另一個至關重要的問題......你如何印刷這些價值觀? – Sebivor 2013-05-01 16:50:36