Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.036 c
1-89993
CAHEK
2003-11-17 13:08
2003.11.27
Ошибка работы с датами?


3-89716
chtr
2003-11-10 10:23
2003.11.27
Как программно сжать базу mdb?


14-90100
panov
2003-11-04 15:02
2003.11.27
О закрытии веток.


1-89821
Миха
2003-11-17 09:39
2003.11.27
Маркеры в TChart


3-89720
lovres
2003-11-10 09:43
2003.11.27
Ошибка Invalid use of keyword в запросе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский