Если код в вашем первом примере - это именно тот код, который вы выполняете, значит, у вас есть библиотека с ошибками. Независимо от того, берете ли вы std::pow
или C's pow
, что требует удвоения, даже если выбрана двойная версия, 10 точно представляется как double
. Как таковое возведение в степень точно представимо как double
. Никаких округлений, усечений или чего-либо подобного не должно быть.
С g ++ 4.5 я не смог воспроизвести ваше (странное) поведение, даже используя -ffast-math
и -O3
.
Теперь я подозреваю, что sections
означает , а не , которому присваивается литерал 10 напрямую, а вместо этого выполняется его внутреннее чтение или вычисление, так что его значение является чем-то вроде 9.9999999999999
, которое при поднятии к четвертой степени генерирует число, подобное 9999.9999999
. Затем оно усекается до целого числа 9999, которое отображается.
В зависимости от ваших потребностей вы можете захотеть округлить либо исходный номер, либо окончательный номер до назначения в int. Например: int i = pow(sections, 5- t -1) + 0.5; // Add 0.5 and truncate to round to nearest.