我知道正常的整數可以通過右移位進行劃分。我想知道是否一個簡單的方法來做同樣的數字不是完美的整數。有人可能會用double的倍數來劃分double或float嗎?
0
A
回答
4
ldexp
, ldexpf
, and ldexpl
分別爲雙打,浮動和長雙打做到這一點。或者,如果你有兩個特定的功率記(比如4),它可能是最好只劃分通常的方式:
whatever/4
0
有一個功能ldexp
(兄弟姐妹),讓您「乘通過兩個冪「(包括負數),這與使用整數移位不同。對於2的冪,對於X和1/X,所有雙值都是「完美的」(因爲如果X是2 n,則1/X = 2 -n,兩者都可以作爲浮動IEEE-754中的點數或任何其他二進制浮點格式),所以不會有任何奇怪的四捨五入,這意味着編譯器應該能夠用乘法運算代替除法運算 - 在我的實驗中,確實如此。
與「應用乘以1/X」相比,操縱浮點值的指數通常對性能不利。
函數ldexp
是glibc中的幾十條指令,其中有幾個分支和一個調用代碼。很難找到ldexp
的任何好處,以及讓不知道x = ldexp(x, -1);
與x /= 2.0;
相同的人感到困惑。
0
只需使用
double x = 7;
x *= 2;
x /= 2;
assert(x == 7.0);
或
double y = 5;
y = 2*x + 0.5*y;
assert(y == 16.5);
或
double z = 2.5*x;
assert(z == 17.5);
爲什麼?因爲你的計算機可以將所有的權力都表示爲浮點值(只要該權力不超過指數的限制,那就是),並且它會這樣做。因此,上面的所有計算都是精確的,常數中沒有舍入誤差。所有的assert()
都保證成功。
當然,您可以通過位操作獲得相同的效果,但當前的浮點硬件可以在納秒內完成乘法運算,並且它可以正確處理所有特殊情況。如果你這樣做,你會浪費時間,或者不正確地處理特殊情況。所以不要嘗試。
相關問題
- 1. 是否有可能通過Java中的Double來倍增BigInteger?
- 2. float或double特殊值
- 3. Flex中的double或float數據類型?
- 4. float or double precision
- 5. Double vs Float - Java
- 6. 位數float和double變量
- 7. Numpy「double」 - 廣播 - 有可能嗎?
- 8. float和double輸出
- 9. 提取float/double值
- 10. Double和Float大小
- 11. 比較float和double
- 12. Java raytracing float vs double
- 13. Java - int/long,float/double
- 14. 比較float比double更高效嗎?
- 15. 比較float和double值與delta嗎?
- 16. Java float比double更精確嗎?
- 17. 有什麼辦法在C#中將'Double'或'double'轉換爲'const Double'或'const double'?
- 18. 可以在JUnit的float和double值上使用assertTrue嗎?
- 19. 將char *轉換爲float或double
- 20. c中的float和double#
- 21. 從double到float的截斷?
- 22. 不能將float或double轉換爲字符數組(sprintf)
- 23. JShell可能有損地從double轉換爲float
- 24. 如何使用float/double模數?
- 25. 從列值中分離float/double/integer
- 26. 在LLVM IR中區分float和double
- 27. printf和co如何區分float和double
- 28. double和float數據類型的行爲
- 29. ef4 poco double/float dbtype mapping
- 30. Double和Float共存實現
你會如何將右邊的221/13分開? –
你的意思是*權力*兩個,對不對? – user2357112
'13'不是'2'的倍數(也不是'2'的倍數,我認爲這是他的意思) –