Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Внизпреобразование string в real Найти похожие ветки
← →
tgrey (2004-08-16 23:27) [0]Доброго времени суток!
В файле хранятся вещественные числа, естественно в текстовом виде, например такое 0,221584612969309, при преобразовании в Real, хоть с помощью val хоть с помощью strtofloat, вместо указанного выше числа получается округлённое примерно так 0,2215846127, вопрос в том как это округление отменить, чтоб числа и в файле и в real были одинаковые?
← →
GanibalLector © (2004-08-16 23:49) [1]Например использовать Extended. А вообще-то Real+F1 должно помочь...там все описания(с разрядностью) для каждого типа.
← →
Паскальные надписи © (2004-08-17 01:26) [2]Считывай по символу.
← →
tgrey (2004-08-17 01:44) [3]GanibalLector не понимаю при чём тут extended, я говорю что при конвертации из string в real получается округлённое число, число получается короче чем в файле, вот в чём проблема
← →
tgrey (2004-08-17 01:46) [4]Паскальные надписи если я считаю по символу, что дальше с ними делать, мне вещественное число нужно получить в итоге
← →
guest (2004-08-17 07:25) [5]Интересно, как ты собираешься "отменить округление" в real? Например, как представить 0.(3) в двоичной системе?
А вообще вот что тебе поможет:
http://www.delphikingdom.ru/asp/viewitem.asp?catalogid=374
← →
Рамиль © (2004-08-17 08:27) [6]Как это при чем extended? Real не обеспечит такой точности.
← →
Паскальные надписи © (2004-08-17 11:38) [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 в таком случае.
← →
Vovchik_A © (2004-08-17 12:49) [8]2tgrey
Читай, что тебе говорят умные люди.
Например, Рамиль © (17.08.04 08:27) [6]
← →
tgrey (2004-08-17 17:24) [9]Посмотрите выполнение этого кода в отладчике
var s:String;
sr:extended;
begin
s:="-0,29805999272503";
sr:=StrToFloat(s);
end;
sr после преобразования не будет равно s, оно будет равно -0.29805999273
← →
Алхимик © (2004-08-17 19:02) [10]
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 - значащие разрады, которые грубо говоря отражают точность числа.
Говорить об отмене точности в фундаментальных дробных типах не корректно.
:)
← →
default © (2004-08-17 19:29) [11]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) [12]FPU вернее
← →
tgrey (2004-08-17 22:32) [13][default]
даже не думал никого обманывать, я смотрел значение sr через окно Watch List, а там оно выглядит вот так -0.29805999273, а в FPU выглядит так как надо, и если его обратно в текст перевисти тоже выглядит как надо, если кто то не верит могу скриншот отправить на мыло
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.033 c