Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.11.27;
Скачать: CL | DM;

Вниз

Дроби   Найти похожие ветки 

 
DeadMeat ©   (2003-11-15 18:41) [0]

Приветствую всех участников...
У меня возникла такая вот проблемка:
есть число double типа, в нём 0.400000000000001. При его делении на 2-два, получается ровно 0.2, а должно быть 0.2000000000000005, или что-нибудь в этом роде... Как этого добиться я не знаю... Искал в модуле MATH, подходящено ничего не нашёл... Может просто плохо искал, не знаю... Если кто натолкнёт меня в нужном направлении, буду очень признателен...


 
MBo ©   (2003-11-15 18:42) [1]

http://delphi.vitpc.com/helloworld/reals.htm


 
DeadMeat ©   (2003-11-15 18:53) [2]

Пасиба... Щас буду читать...


 
default ©   (2003-11-15 19:04) [3]

используй переменную(ые) типа Extended и для вывода ф-ию FloatToStrF, которую вызывай с параметром Precision = 18


 
DeadMeat ©   (2003-11-15 19:11) [4]

И на этом тоже пасиба... Щас буду и это использовать...


 
Anatoly Podgoretsky ©   (2003-11-15 19:11) [5]

То что ты хочешь принципильно не решается, а решается только с помощью чисел с фиксированой запятой


 
default ©   (2003-11-15 19:13) [6]

я пробовал твой пример, всё нормально, или точности Double не хватало или строковая функция "лишние" знаки обрубала или всё вместе


 
default ©   (2003-11-15 19:18) [7]

вообще число может получиться не таким каким должно из-за двух причин - или точности типа данных не хватает или оно точно не представимо в двоичной с/с (и не только в ней), или всё вместе


 
DeadMeat ©   (2003-11-15 19:28) [8]

Самое интересное, это то, что этот пример в чистом виде работает почти правильно..., т.е. в результате что-то типа 0.2000000000000001, а у calc.exe получается 0.2000000000000005...
Весь прикол в том, что когда эти числа не задаются на прямую, а вычисляются (обработчик Button3) то результат в первый раз 0.2000000000000001, а во второй и последующие 0.2

Вот примерный код:

const wd=12.4;
hg=10;

var i:integer;

procedure TForm1.Button1Click(Sender: TObject);
var buf1,buf2:double;
begin
//"Лобовые" вычисления
buf1:=0.400000000000001;
buf2:=buf1/2;
caption:=floattostr (buf2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var len,hgt:double;
begin
//Сокращённые, "реальные" вычисления
len:=wd/0.6;
hgt:=hg/0.6;
caption:=(floattostr ((frac (len)*0.6)/2));
end;

procedure TForm1.Button3Click(Sender: TObject);
var len,hgt:double;
begin
//Вычисления непосредственно в программе, т.е. "реальные"
len:=wd/0.6;
hgt:=hg/0.6;
for i:=1 to trunc (hgt) do
begin
for j:=1 to trunc (len) do caption:="Calculating...";
memo1.lines.add (floattostr (frac (len)*0.6/2));
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var len,hgt:extended;
begin
//Немного подправленные
len:=wd/0.6;
hgt:=hg/0.6;
caption:=(floattostrf ((frac (len)*0.6)/2,ffGeneral,18,18));
end;

Вообщем постепенно схожу с ума... Как одна и та же процедура, при одних и тех же параметрах, может выдавать разные результаты...???
В прочем похожий прикол, только на другую тему, у меня уже был..., не так давно... Тогда я выпив 2-две чашки кофе, с взъерошенными волосами, и опухшими до посинения глазами плюнул на всё, и пошёл спать...
Может это проклятье...??


 
default ©   (2003-11-15 19:30) [9]

читай default © (15.11.03 19:04) [3] + статья


 
Nikolay M. ©   (2003-11-15 19:33) [10]


> Как одна и та же процедура, при одних и тех же параметрах,
> может выдавать разные результаты...???

Вчера только ссылку приводили:
http://www.citforum.ru/programming/delphi/miracles/


 
DeadMeat ©   (2003-11-15 19:36) [11]

Я согласен, если я где-то не прав... С дробями (как в программировании, так и в школе) у меня всегда было плохо..., но почему в первый раз результат один, а в последующие другой...??
Может в статье ответ...?? Уже немного почитал... щас дочитываю...


 
default ©   (2003-11-15 19:38) [12]

что-то ты больно быстро её...только вроде дали...
напиши конкретно какой код "глючит"
у тебя там не видно где "j" объявлена


 
DeadMeat ©   (2003-11-15 19:39) [13]

Пока писал, уже чего-то добавили... Будем смотреть...


 
DeadMeat ©   (2003-11-15 19:44) [14]

> что-то ты больно быстро её...только вроде дали...
напиши конкретно какой код "глючит"

Я же сказал, что ещё её не дочитал...

> у тебя там не видно где "j" объявлена

i и j объявлены "на верху", там где Form1: TForm1;
Они integer


 
default ©   (2003-11-15 19:51) [15]

ты напиши код(а не всё подряд...)


 
DeadMeat ©   (2003-11-15 20:00) [16]


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Memo1: TMemo;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const wd=12.4;
hg=10;

var
Form1: TForm1;
j,i:integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var buf1,buf2:double;
begin
buf1:=0.400000000000001;
buf2:=buf1/2;
caption:=floattostr (buf2);
end;

procedure TForm1.Button2Click(Sender: TObject);
var len,hgt:double;
begin
len:=wd/0.6;
hgt:=hg/0.6;
caption:=(floattostr ((frac (len)*0.6)/2));
end;

procedure TForm1.Button3Click(Sender: TObject);
var len,hgt:double;
begin
len:=wd/0.6;
hgt:=hg/0.6;
for i:=1 to trunc (hgt) do
begin
for j:=1 to trunc (len) do caption:="Calculating...";
memo1.lines.add (floattostr (frac (len)*0.6/2));
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
var len,hgt:extended;
begin
len:=wd/0.6;
hgt:=hg/0.6;
caption:=(floattostrf ((frac (len)*0.6)/2,ffGeneral,18,18)); //Кстати, здесь я перепробовал все значения Format и этот оставил просто так...
end;

end.


> default © (15.11.03 19:51) [15]
В смысле вот это...??


 
default ©   (2003-11-15 21:04) [17]

какой их этих методов при разных запусках с одними и теми же входными данными даёт разные результаты?


 
DeadMeat ©   (2003-11-16 15:51) [18]

> какой их этих методов при разных запусках с одними и теми же входными данными даёт разные результаты?

Button3... При этом результатов всего два... В начале один, а потом другой, который и держится до конца...
Хотя сегодня уже работает нормально, хоть и не правильно... Может вчера какая-нибудь софтина мешала...??


 
default ©   (2003-11-17 00:19) [19]

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


 
DeadMeat ©   (2003-11-17 14:44) [20]

> так уж устроено, придумай реализацию вычислений с бесконеной точностью - тебе Нобеля дадут и всем приятное сделаешь
Учту... А разве Нобеля программистам дают...??


 
default ©   (2003-11-17 20:44) [21]

DeadMeat © (17.11.03 14:44) [20]
"А разве Нобеля программистам дают...??"
до сих пора вроде нет, сделаешь что-нибудь выдающееся дадут


 
Anatoly Podgoretsky ©   (2003-11-17 21:44) [22]

DeadMeat © (17.11.03 14:44) [20]
За такое ничего не жалко.



Страницы: 1 вся ветка

Текущий архив: 2003.11.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.016 c
7-90142
mr_All
2003-09-17 11:08
2003.11.27
Как определить произошла ли регистрация любого пользователя ?


4-90163
Юрий Ж.
2003-10-01 16:02
2003.11.27
Работа с ресурсами...


3-89693
Василиск
2003-11-06 11:27
2003.11.27
Как бороться с сообщениями сервера?


1-89836
DimaK
2003-11-16 17:45
2003.11.27
ProgressBar


1-89910
hellmachine
2003-11-15 04:23
2003.11.27
Возможно ли программно определить - был ли перекрыт виртуальный