[英]Incorrect floating point behavior
當我在支持軟件浮點仿真(禁用了硬件浮點)的32位powerpc內核中運行以下C ++程序時,我得到了不正確的條件評估。 有人可以告訴我這里的潛在問題是什么?
#include <stdio.h>
int main() {
int newmax = 1;
if ((newmax + 0.0) > 256) {
printf("\nShouldn't be here\n");
} else {
printf("\nShould be here\n");
}
}
編譯:
powerpc-linux-g++ -msoft-float -c floating.cxx
powerpc-linux-g++ -o floating floating.o
目標系統中的輸出:
[linux:/]$ ./floating
Shouldn't be here
鏈接時也應指定-msoft-float。給我們提供帶有-S標志的反匯編:powerpc-linux-g ++ -msoft-float -c float.cxx -S -o float.s
首先,為什么禁用硬件浮點?
由於這種類型,可能會以不正確的順序執行轉換。
(double)1 = 0x3FF0000000000000
(float) 1 = 0x3F800000
這是你的情況。
if ((newmax + 0.0) > 256)
在您的情況下:1)newmax轉換為浮動或翻倍; 2)加0.0; 3)將價值轉換回int。
它取決於您的計算機,但是int通常是32位值。 要檢查它,您可以使用:
int i;
printf("%d", sizeof(i));
無論如何,回到您的問題,在將計算值轉換為int之后,您將獲得大的正數。 在您的情況下,我將其打印/或不與0x100進行比較,而是與
0x3F800000、0x3FF0000000000000、0x3FF00000
要找出發生了什么,但最好是拆卸。
可能不是那么有用,但這只是我的想法,發生了什么。
從編譯器錯誤到匯編器錯誤再到鏈接器錯誤再到內核錯誤。 正如其他人已經指出的那樣:如果提供了-S選項的編譯輸出,則可以驗證(或排除)編譯器錯誤-這是該錯誤的最可能來源。 如果不是編譯器錯誤,則浮點模擬的內核錯誤將是問題的下一個可能來源。
代碼newmax + 0.0中的語句以float或double形式生成結果,但將其與整數值進行比較。
因此這個錯誤。
試試看
int i=1;
printf("%d",(i+0.0));
無論i的值如何,您每次都得到結果0。 鑒於,
int i=1;
printf("%f",(i+0.0));
這產生1.0000
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.