pow
возвращает двойной, и с двойниками вы всегда должны беспокоиться о точности. Продукт number * pow(...)
может не возвращаться точно 1. Это может быть 0,99 или что-то еще, что почти 1, но не совсем. Когда это значение будет возвращено в целое число без знака number
, оно будет понижено в сторону, чтобы стать int, и округлено до 0.
Чтобы обойти это, вы всегда можете реализовать свою собственную функцию pow
с целыми числами. Я бы рекомендовал реализовать с помощью longs, потому что ваши целые числа могут быстро переполняться (например, base = 50, exponent = 6 легко превышает 32 бита, обычно выделяемые для ints).
См. Ответы на вопрос this SO question для получения более подробной информации по вопросу pow
.
Подождите, какая точность?
Многие числа не могут быть выражены с помощью конечного двоичного представления. Тип float
является одним из таких конечных двоичных представлений. Поплавок может хранить только определенное количество бит информации (что вы можете представить как точность), поэтому любые биты, которые не подходят, отбрасываются. Эта потеря информации - это то, почему числа с плавающей запятой могут иметь такие ошибки. Вы можете узнать больше об этом here.
ли вам '#include'? Я получил правильный ответ. –
unxnut
1) Нет проблем с компиляцией или связыванием. @MitchWheat вы можете подробно рассказать о том, что может быть неправильным с точностью? – iammk
Нет такого числа с плавающей запятой, как 10^-9, поэтому результат 'pow' обязательно будет приближенным. Маловероятно, что умножение этого приближения на 1000000000 даст ровно 1. –