簡體   English   中英

C程序為簡單的數學給出了錯誤的輸出!

[英]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中發布了此內容,但這可能很愚蠢。 不會再這樣做了。

日志返回雙精度。 您應該舍入而不是截斷。 但是,您可以在此處使用log2

發生的情況是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM