Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

преобразование string в real [D6, WinXP]


tgrey ©   (2004-08-16 23:27:00) 

Доброго времени суток!

В файле хранятся вещественные числа, естественно в текстовом виде, например такое 0,221584612969309, при преобразовании в Real, хоть с помощью val хоть с помощью strtofloat, вместо указанного выше числа получается округлённое примерно так 0,2215846127, вопрос в том как это округление отменить, чтоб числа и в файле и в real были одинаковые?


tgrey   (2004-08-17 22:32:00) [1]

[default]
даже не думал никого обманывать, я смотрел значение sr через окно Watch List, а там оно выглядит вот так -0.29805999273, а в FPU выглядит так как надо, и если его обратно в текст перевисти тоже выглядит как надо, если кто то не верит могу скриншот отправить на мыло


default   (2004-08-17 19:29:00) [2]

procedure TForm1.Button1Click(Sender: TObject);
var
 s:String;
 sr:extended;
begin
 s:='-0,29805999272503';
 sr := StrToFloat(s);
 asm
   FLD  sr
 end;
 // Caption := FloatToStr(sr)
end;
открой окно CPU после FLD и посмотри...обманывать нехорошо


default   (2004-08-17 19:29:00) [3]

FPU вернее


Алхимик   (2004-08-17 19:02:00) [4]

Fundamental real types
Type     Range                          Significant digits Size in bytes
Real48  2.9x10^-39 .. 1.7 x 10^38      11-12              6
Single  1.5x10^-45 .. 3.4 x 10^38      7-8            4
Double  5.0x10^-324 .. 1.7 x 10^308    15-16            8
Extended 3.6x10^-4951 .. 1.1 x 10^4932  19-20            10
Comp -2^63+1..2^63 -1                19-20            8
Currency  -922337203685477.5808..
          922337203685477.5807         19-20              8



Significant digits - значащие разрады, которые грубо говоря отражают точность числа.
Говорить об отмене точности в фундаментальных дробных типах не корректно.
:)


tgrey   (2004-08-17 17:24:00) [5]

Посмотрите выполнение этого кода в отладчике

var s:String;
   sr:extended;
begin
 s:='-0,29805999272503';
 sr:=StrToFloat(s);
end;

sr после преобразования не будет равно s, оно будет равно -0.29805999273


Vovchik_A   (2004-08-17 12:49:00) [6]

2tgrey  

Читай, что тебе говорят умные люди.
Например, Рамиль ©   (17.08.04 08:27) [6]


Паскальные надписи   (2004-08-17 11:38:00) [7]


> tgrey   (17.08.04 01:46) [4]

Организуй цикл, что-то типа этого

b:=1; res:=0;
while символ<>' ' do begin
 читаем_символ;
 if символ<>'.' then begin
   res:=res+chartoint(символ)/b;
   b:=b*10;  
 end;
end;

До запятой только одна цифра, но можно обуниверсалить.
Chartoint можно через case.
Лучше, чтобы символы через пробел шли,
 тогда можно read(f,символ).
О скорости тут говорить нечего, конечно...
Спроси лучше знатоков Assembler в таком случае.


Рамиль   (2004-08-17 08:27:00) [8]

Как это при чем extended? Real не обеспечит такой точности.


guest   (2004-08-17 07:25:00) [9]

Интересно, как ты собираешься "отменить округление" в real? Например, как представить 0.(3) в двоичной системе?
А вообще вот что тебе поможет:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374


tgrey   (2004-08-17 01:46:00) [10]

Паскальные надписи если я считаю по символу, что дальше с ними делать, мне вещественное число нужно получить в итоге


tgrey   (2004-08-17 01:44:00) [11]

GanibalLector не понимаю при чём тут extended, я говорю что при конвертации из string в real получается округлённое число, число получается короче чем в файле, вот в чём проблема


Паскальные надписи   (2004-08-17 01:26:00) [12]

Считывай по символу.


GanibalLector   (2004-08-16 23:49:00) [13]

Например использовать Extended. А вообще-то Real+F1 должно помочь...там все описания(с разрядностью) для каждого типа.


Наверх

Титульная страница Поиск, карта сайта Написать письмо