Когда я запускаю приведенную ниже программу на 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
Вы также должны указывать -msoft-float при линковке
Дайте нам разборку с флагом -S: powerpc-linux-g ++ -msoft-float -c плавающий.cxx -S -o плавающий.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 дает результат с плавающей или двойной, но сравнивается с целочисленным значением.
таким образом, эта ошибка.
Попробуйте это,
int i=1;
printf("%d",(i+0.0));
вы получите результат 0 каждый раз, независимо от значения i.
В то время как,
int i=1;
printf("%f",(i+0.0));
Это производит 1.0000