Форум: "Основная";
Текущий архив: 2003.11.27;
Скачать: [xml.tar.bz2];
ВнизДроби Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c