Неверное поведение с плавающей точкой

Когда я запускаю приведенную ниже программу на C ++ в 32-битном ядре powerpc, которое поддерживает программную эмуляцию с плавающей запятой (аппаратная с плавающей запятой отключена), я получаю неверную условную оценку. Кто-нибудь может сказать мне, в чем здесь потенциальная проблема?

#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

14

Решение

Вы также должны указывать -msoft-float при линковке
Дайте нам разборку с флагом -S: powerpc-linux-g ++ -msoft-float -c плавающий.cxx -S -o плавающий.s

1

Другие решения

Во-первых, почему аппаратная плавающая точка отключена?

Из-за этого типа приведение может быть выполнено в неправильном порядке.

(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

Чтобы выяснить, что случилось, но разборка — лучший вариант.

Возможно, это было не так полезно, но это была только моя идея, что случилось.

0

Это может быть что угодно: от ошибки компилятора до ошибки ассемблера, от ошибки компоновщика до ошибки ядра. Как уже отмечали другие люди: ошибки компилятора, который является наиболее вероятным источником этой ошибки, можно проверить (или исключить), если вы предоставили выходные данные компиляции с опцией -S. Если это не ошибка компилятора, ошибка ядра с эмуляцией с плавающей запятой будет следующим вероятным источником проблемы.

0

Оператор в вашем коде newmax + 0.0 дает результат с плавающей или двойной, но сравнивается с целочисленным значением.

таким образом, эта ошибка.

Попробуйте это,

int i=1;
printf("%d",(i+0.0));

вы получите результат 0 каждый раз, независимо от значения i.
В то время как,

int i=1;
printf("%f",(i+0.0));

Это производит 1.0000

-1
По вопросам рекламы [email protected]