Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.11.2009, 21:53   #1
bloodeagle
 
Регистрация: 11.11.2009
Сообщений: 4
По умолчанию Это ошибка Delphi или моя ошибка???

Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
a,b,c,d,h,y,x:real;
begin
a:=StrToFloat(Edit1.Text);
b:=StrToFloat(Edit2.Text);
h:=StrToFloat(Edit3.Text);
c:=3;
d:=5;
x:=a;
Memo1.Clear;
Memo1.Lines[0]:=' x | y ';
Memo1.Lines.Add('------------');
repeat
if (x>0) then y:=d*ln(x*x)+2*c*sqrt(x)
else y:=abs(d*x)+c*exp(2*x);
Memo1.Lines.Add(FloatToStrf(x,fffix ed,5,20)+' | '+FloatToStrf(y,fffixed,5,2));
x:=x+h;
until x>b;
end;
end.
Почему он при a=-2, b=1 и h=0.1 берёт не 0, а приблизительно 0??? И почему не выводит значение при х=1??? Что не так??? Помогите пожалуйста понять...
Изображения
Тип файла: jpg 1.JPG (79.7 Кб, 132 просмотров)
bloodeagle вне форума Ответить с цитированием
Старый 11.11.2009, 22:36   #2
grenles
минимакс
Участник клуба
 
Аватар для grenles
 
Регистрация: 11.06.2008
Сообщений: 1,143
По умолчанию

Дааа. прикольно
при
a=-1 x= 0. 0 ...138
a=-3 x= 0. 0 ...1526
...
a= - 30 000 X= -0,0000001560700

Вывод только один - Дельфи как-то неточно хранит или работает с числами с плавающей точкой.....

При этом, Если сделать шаг 0,5 - эффетка нет. Эффект начинается с еще одного прикол
а=-3 шаг 0,3 =0,,,,3333
а=-4 шаг 0,4 =0,,,,5555
а=-6 шаг 0,6 =0,,,,6666

при формате вывода ffExponent 6,3838E-16 | 0,00 имеем более точное представление нуля. Выход ноль это не чистый ноль, а некое число.
Что доказывает - вакуум населен!!!

Мое предложение- используйте округление до заданной точности.

а вот вам еще больший прикол

-0,999999999999999 | 0,00
-0,899999999999999 | 0,00
-0,799999999999999 | 0,00
-0,699999999999999 | 0,00
-0,599999999999999 | 0,00
-0,499999999999999 | 0,00
-0,399999999999999 | 0,00
-0,299999999999999 | 0,00
-0,199999999999999 | 0,00
-0,0999999999999994 | 0,00
6,38378239159465E-16 | 0,00
0,100000000000001 | 0,00
0,200000000000001 | 0,00
0,300000000000001 | 0,00
0,400000000000001 | 0,00
0,500000000000001 | 0,00
0,600000000000001 | 0,00
0,700000000000001 | 0,00
0,800000000000001 | 0,00
0,900000000000001 | 0,00

Код:
FloatToStr(x)
-2 | 1,0864625110755E-311
-1,9 | 1,0864625110755E-311
-1,8 | 1,0864625110755E-311
-1,7 | 1,0864625110755E-311
-1,6 | 1,0864625110755E-311
-1,5 | 1,0864625110755E-311
-1,4 | 1,0864625110755E-311
-1,3 | 1,0864625110755E-311
-1,2 | 1,0864625110755E-311
-1,1 | 1,0864625110755E-311

То есть на самом деле в памяти хранится мусор.
Но если сделать
Код:
x:=0;
Мусор исчезает.

Прикол.. начнем с -1,1 с шагом 0,1 и вот что удивительно мусор появляется при переходе
-0,4 | 0
-0,3 | 0
-0,2 | 0
-0,1 | 0
-1,38777878078145E-16 | 0
0,0999999999999999 | 0
0,2 | 0
0,3 | 0
0,4 | 0
0,5 | 0

Получается Дельфи тупит с "мизерами" и "плавающими точками", либо это особенности реализация ассеблера????

Код:
Sub trt()
 Dim x As Double
 Dim h As Double
 Dim i As Integer
 Dim b As Integer
 
 i = 1
 x = -2
 h = 0.1
 b = 1
 Do
 Cells(i, 1) = x
 i = i + 1
 x = x + h
 Loop Until x > b
End Sub
то же самое на Макросах офиса - вывод - это реализация плавающей точки в имеющемся у нас с вами процессоре.... выходит так.

6,38378239159465E-16 = (приблизительно) = ноль!!!!!

вот еще для наглядности
Код:
-1,100000000000000000000000000000
-0,999999999999999000000000000000
-0,899999999999999000000000000000
-0,799999999999999000000000000000
-0,699999999999999000000000000000
-0,599999999999999000000000000000
-0,499999999999999000000000000000
-0,399999999999999000000000000000
-0,299999999999999000000000000000
-0,199999999999999000000000000000
-0,099999999999999400000000000000
0,000000000000000638378239159465
и это пройдет...

Последний раз редактировалось grenles; 11.11.2009 в 23:46.
grenles вне форума Ответить с цитированием
Старый 12.11.2009, 15:17   #3
bloodeagle
 
Регистрация: 11.11.2009
Сообщений: 4
По умолчанию

Это получается так и должно быть и это в порядке вещей???
bloodeagle вне форума Ответить с цитированием
Старый 12.11.2009, 15:26   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Это нормально, процессор не всегда может выполнять операции с вещественными числами абсолютно точно. Попробуй использовать тип extended вместо real, но какая-то мизерная погрешность всё-равно будет
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Что это за ошибка LuMax Помощь студентам 4 05.03.2013 13:18
Хуки (тестовый пример). В чем моя ошибка? Tihon Win Api 2 31.12.2008 11:59
Скажите, в чем моя ошибка в сортировке, или напишите, как правильно сортировать. язык Паскаль. Devo4ka Паскаль, Turbo Pascal, PascalABC.NET 0 26.11.2008 00:19
Ошибка в Delphi или нет? vitalik007 Общие вопросы Delphi 3 10.04.2008 19:47
базовые и производные классы (В чём моя ошибка) umnix Общие вопросы C/C++ 5 01.12.2007 17:26