n-й корень числа

Я написал программу для вычисления n-го корня числа до 2 десятичных знака. например, 4-й корень из 81 - 3., 3-й корень из 125 - 5. кто-нибудь может отладить это ?? Я буду очень благодарен.

6
задан JeremyP 16 August 2010 в 15:56
поделиться

7 ответов

Вам необходимо прочитать «Что должен знать каждый компьютерный ученый об арифметике с плавающей запятой» .

Числа с плавающей запятой - которые обычно используются для представления нецелых чисел - по своей сути ограничены. Эти ограничения позволяют добиться хорошей производительности, но за счет таких аномалий.

10
ответ дан 8 December 2019 в 04:27
поделиться

Это потому, что компьютеры не могут правильно работать с вещественными числами.

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

5
ответ дан 8 December 2019 в 04:27
поделиться

Что ж, если вам нужна точность 0,01, вам потребуется шаг 0,005 или меньше, а затем выполнить округление. Лучше всего использовать pow (num1, 1 / n): -)

2
ответ дан 8 December 2019 в 04:27
поделиться

Ответ, как и в большинстве проблем с плавающей точкой, заключается в том, что C работает с ограниченной точностью. А плавающие числа являются двоичными. Они не могут точно представить десятичное число 1.99 - скорее всего, это будет близкое значение типа 1.990000000023.... .

Стандартная ссылка для решения этих задач: What Every Computer Scientist Should Know About Floating-Point

К счастью, есть простое решение (но не идеальное!). Найдите корень из (num*10000.0), используя приращения единицы. Это будет, конечно, 100-кратный корень, который вам действительно нужен. Следовательно, последние две цифры - это "десятичные знаки", которые вы хотели получить. Вы обнаружите, что корень из 40000,0 в точности равен 200,0 Это работает, потому что 1,0 может быть идеально представлено.

Цена, которую вы платите за точность на этом конце, заключается в том, что вы теряете ее на другом конце - умножение на 10000 означает потерю точности с более высокими числами. Легкие решения редко бывают без недостатков, извините.

5
ответ дан 8 December 2019 в 04:27
поделиться

что сказал М.С.альтерс. попробуйте уменьшить инкремент , чтобы увидеть, как значение постепенно приближается к 2,0. вы можете захотеть иметь более высокую «внутреннюю» точность (т. е. увеличить) по сравнению с тем, что вы возвращаете, и округлить внутренний результат, скажем, до двух цифр. Таким образом можно скрыть проблемы округления (но это всего лишь непроверенное подозрение)

1
ответ дан 8 December 2019 в 04:27
поделиться

Двойные числа не обязательно точно представляют числа с плавающей запятой. Попробуйте вместо этого использовать десятичный тип данных (если у c есть такое мышление, извините, не могу вспомнить). В C # есть десятичные числа, в Java есть классы BigDecimal для точного представления чисел с плавающей запятой.

0
ответ дан 8 December 2019 в 04:27
поделиться

Меньшее значение «приращения» должно работать, я использовал 0,001, а root1 вернул 2,00 для квадратного корня из 4.

Кроме того, если вы хотите, чтобы ответ отображался с двумя десятичными знаками используйте% .2f при печати корня.

0
ответ дан 8 December 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: