[英]C program giving incorrect output for simple math!
(所有都聲明為int,沒有一個事先初始化為任何東西。我包含math.h並使用-lm進行編譯)
cachesize = atoi(argv[1]);
blocksize = atoi(argv[3]);
setnumber = (cachesize/blocksize);
printf("setnumber: %d\n", setnumber);
setbits = (log(setnumber))/(log(2));
printf("sbits: %d\n", setbits);
當給定的cachesize為1024且塊大小為16時,輸出如下:
setnumber: 64
sbits: 5
但是log(64)/ log(2)= 6!
當給定的cachesize為512,塊大小為32時,它可以正常工作。我似乎贏不了。
我真的希望這是我的愚蠢錯誤,如果有人能指出這是什么,我將不勝感激! 謝謝!
PS:我首先在Yahoo Answers中發布了此內容,但這可能很愚蠢。 不會再這樣做了。
發生的情況是log(2)
或log(setnumber)
都不能精確地表示為浮點數,並且它們的舍入誤差正合謀導致其商數舍入到小於6
,當您將其舍入為5
時轉換為整數。
使用log2( )
將在某些具有優質數學庫的平台上解決此問題,但是C標准實際上並不能保證有關log( )
或log2( )
的准確性(實際上,某些平台僅實現了log2( )
如log( )/log(2)
,因此它可能會給您帶來與您現在同樣的問題)。
您想使用ilogb( )
函數,該函數以帶符號的整數值形式返回其參數的指數。
setbits = ilogb(setnumber);
這具有在某些平台上更快的優點。
(誠然,這種使用ilogb
不能移植到使用非基數2浮點的系統上,但這要比僅具有劣質數學庫的平台要小得多)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.