| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Извлечение квадратного корня |
| Автор: mr.Anderson 12.2.2006, 19:38 |
| Не сумел найти ответа в FAQ (там есть похожая тема, но она не открывается). Как написать примерно по такому алгоритму прогу: 1. Юзер вводит число. 2. Если из числа можно извлечь корень, и полученное число будет целым, то вывести полученное число. 3. Если из числа можно извлечь корень, но полученное число нецелое, то сказать об этом и вывести нецелый результат. 4. Если корень не извлекается (т.е. число иррациональное), то сказать об этом и ничего не делать. Я не прошу написать программочку за меня, я прошу объяснить мне алгоритм ее написания. И подбросьте плиз функцию извлечения кв. корня из чисел, из которых он нацело не извлекается... |
| Автор: Mayk 12.2.2006, 19:45 | ||
sqrt
|
| Автор: mr.Anderson 12.2.2006, 19:48 | ||
Спасибо! Только вот на этот вопрос нет ответа:
|
| Автор: profispb 12.2.2006, 19:52 |
| sim7, Умнож дробное число на 1.0 и функция SQRT(3.567*1.0); |
| Автор: Mayk 12.2.2006, 19:52 | ||
(static_cast<int>(v) == v) будет истинным <=> v целое |
| Автор: mr.Anderson 12.2.2006, 19:54 | ||
Тьфу ты. Точно. А код
Будет работать правильно? Т.е. програ скажет, что корень извлечь нельзя? |
| Автор: Mayk 12.2.2006, 20:02 | ||
ээ. скорее всего выделенный участок никогда не выполнится. |
| Автор: Adil' 13.2.2006, 17:16 |
| , это как повезет - если не ошибаюсь static_cast<int>(v) при сравнении с v (которое doulbe) будет приведено к double, и если static_cast<int>(v) нельзя разложить в ряд по степеням двойки, то... Лучше сравнивать так if(fabs(v-(int)v)<1.e-10) |
| Автор: threef 13.2.2006, 18:52 |
| a^2=x a= x/a 2a=a+x/a a[k]=(a[k-1]+x/a)/2 | a[k]-a[k-1] | < epsilon Это формула Ньютона, к - шаг итерации. А проверить , является ли число целым - привести к int корень и возвести в квадрат. С учетом того, что целые должны входить в диапазон целых чисел. |
| Автор: Mayk 13.2.2006, 19:43 | ||||||||
| А когда это двоичное число нельзя разложить по степеням двойки? Проверим:
Тест 1. Абсолютно случайные.
Тест 2. Сверх малые ( [0;1) ). 0) Убрать * rand(). 1) Запустить. Очевидно, результат тот же самый что и в предыдущем примере. Тест 3. Случайные целые. Заменить double f = drand48(); на double f = rand();
Тест 4. Последовательные целые.
Итого проверено 10240000 * 15 * 3 + 10240000 = 471.040.000 чисел. Надежность static_cast проверки считаю доказанной. |