![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
преобразование 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 должно помочь...там все описания(с разрядностью) для каждого типа.