2014-01-11 3 views
0

Я столкнулся с странными проблемами с кодом ниже,C - пау() странное поведение

uint32 number = 1000000000; 
number = number * pow(10, -9); 
printf("number is %d\n", number); 

Я вижу число получения печатается как «0», в то время как я ожидаю, что число будет «1». Может ли кто-нибудь указать, что может вызвать это? Это на платформе MPC8248.

Заранее спасибо.

тк

+0

ли вам '#include '? Я получил правильный ответ. – unxnut

+0

1) Нет проблем с компиляцией или связыванием. @MitchWheat вы можете подробно рассказать о том, что может быть неправильным с точностью? – iammk

+2

Нет такого числа с плавающей запятой, как 10^-9, поэтому результат 'pow' обязательно будет приближенным. Маловероятно, что умножение этого приближения на 1000000000 даст ровно 1. –

ответ

3

pow возвращает двойной, и с двойниками вы всегда должны беспокоиться о точности. Продукт number * pow(...) может не возвращаться точно 1. Это может быть 0,99 или что-то еще, что почти 1, но не совсем. Когда это значение будет возвращено в целое число без знака number, оно будет понижено в сторону, чтобы стать int, и округлено до 0.

Чтобы обойти это, вы всегда можете реализовать свою собственную функцию pow с целыми числами. Я бы рекомендовал реализовать с помощью longs, потому что ваши целые числа могут быстро переполняться (например, base = 50, exponent = 6 легко превышает 32 бита, обычно выделяемые для ints).

См. Ответы на вопрос this SO question для получения более подробной информации по вопросу pow.

Подождите, какая точность?

Многие числа не могут быть выражены с помощью конечного двоичного представления. Тип float является одним из таких конечных двоичных представлений. Поплавок может хранить только определенное количество бит информации (что вы можете представить как точность), поэтому любые биты, которые не подходят, отбрасываются. Эта потеря информации - это то, почему числа с плавающей запятой могут иметь такие ошибки. Вы можете узнать больше об этом here.

0

номер = номер * SomeFloat

целое число, умноженное на число с плавающей? Должно указывать число с плавающей запятой. Результат, назначенный целочисленной переменной? Float получает неявное преобразование в целое число ??? Опасность !

Используйте круглую функцию, по крайней мере, как предложено комментариями.

Не рассчитывайте количество artihmetics на вашем компьютере является тем же, что числа в математике, как вы учили в школе (по крайней мере, не совсем)

Смежные вопросы