Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
ВнизДробные числа Найти похожие ветки
← →
default (2003-06-01 20:46) [0]Мастера срочно нужна помощь!
var
h, R: Real;
begin
h := 0.01;
R := 0.5;
repeat
WriteLn(R);
R := R + h;
until R > 1;
readLn
end.
// это лишь пример...
R = 1 в данном случае не выведется, знаю
что это связанно с внутренним представлением
дробных чисел, но как лечить? нужно СРОЧНО, поэтому
отсылать меня к литературе не надо
← →
jack128 (2003-06-01 21:19) [1]сравнить переменную К с константой M
if Round(K*1000000) = M*1000000 then // K = M
тут возможны проблемы с переполнением, все таки Round(x) - это Int64, a x - Extended
← →
default (2003-06-01 22:20) [2]jack128 ©
можно StrToFloat(FloatToStr(X))
← →
Юрий Зотов (2003-06-01 22:46) [3]...
R := R + h;
if Abs(R - 1) < h then R := 1;
...
← →
default (2003-06-01 23:15) [4]Юрий Зотов © (01.06.03 22:46)
а не Abs(R - 1) > h ?
единица была для примера
пусть вместо единицы будет n
тогда для некоторого n и начального значения R код с Вашей вставкой зацикливается(
← →
default (2003-06-01 23:18) [5]Юрий Зотов © (01.06.03 22:46)
"тогда для некоторого n и начального значения R код с Вашей вставкой зацикливается("
это понятно из-за чего...
и со вставкой тоже...
но какой тогда сто процентный выход(
← →
default (2003-06-01 23:27) [6]repeat
x0 := x0 + h;
if Abs(x0 - xmax) < 1E-11 then x0 := xmax;
until x0 > xmax
вот так наверно оставить!?
← →
Юрий Зотов (2003-06-02 00:17) [7]1. Это был всего лишь пример коррекции, подсказка. Не стоит рассматривать его, как конкретный код, он всегда зависит от задачи.
2. Можно оставить и так, но в подобных случаях лучше использовать не константы типа 1E-11, а такие вещи, как машинный ноль и машинное эпсилон. Прочитайте на Королевстве в разделе Hello, World статью Антона Григорьева о вещественных числах - много полезного.
← →
default (2003-06-02 00:37) [8]Юрий Зотов © (02.06.03 00:17)
про статью знаю просто пока времени нет
но всё равно спасибо
← →
KSergey (2003-06-02 08:16) [9]> default © (02.06.03 00:37)
А постить куучу сообщений и читать их да еще экспериментировать - веремя есть?!!!! А может быстрее было бы статью читнуть?
← →
Sandman25 (2003-06-02 10:29) [10]for i := 0 to 50 do
writeln(0.5+0.01*i);
← →
Anatoly Podgoretsky (2003-06-02 10:35) [11]А что меняет?
Float на то и Float, что большинство чисел в нем невозможно представить точно, только приблизительно, 0.01 одно из таких чисел, переход на большую точность сути не меняет.
← →
Sandman25 (2003-06-02 10:51) [12]>А что меняет?
Если вопрос был ко мне, то теперь не нужно заботиться о том, когда выходить из цикла (все эти сравнения с машинным нулем и т.д.). Хотя, конечно, выход может осуществиться слишком рано или слишком поздно. Но и тут все зависит от постановки задачи - в чем смысл цикла.
← →
default (2003-06-02 15:46) [13]KSergey © (02.06.03 08:16)
не быстрее
тем более при изучении устр-ва дробных чисел
я бы ОБЯЗАТЕЛЬНО стал изучать программирование сопроцессора на ассемблере
может потом и статья будет не нужна) и так скорее всего всё будет очевидно
а на это нужно время
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.12;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c