簡體   English   中英

錯誤的浮點行為

[英]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.

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