Проблемы с FloatToStr()

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Проблемы с FloatToStr()

Сообщение tria » 22.08.2006 13:18:48

В Делфи:
FloatToStr(-58.399999999999999)="-58.4"
В Лазаре:
FloatToStr(-58.399999999999999)="-58.399999999999999"
Собственно вопрос в следующем.
Ка сделать, чтобы в Лазаре работало так как в Делфи?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение shade » 22.08.2006 13:32:07

Код: Выделить всё
Format('%.1f', [-58.399999999999999])
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение tria » 22.08.2006 13:50:01

shade писал(а):
Код: Выделить всё
Format('%.1f', [-58.399999999999999])


Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Или есть какая-то спецификация форматной строки, о которой я не знаю?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение STAKANOV » 22.08.2006 14:07:19

tria писал(а):В Делфи:
FloatToStr(-58.399999999999999)="-58.4"


А это действителдьно так? Т.е проверка проводилась именно

Код: Выделить всё
if FloatToStr(-58.399999999999999)='-58.4' then
writeln('yes')
else
writeln('no');


или что-то вроде этого? Если да, то возможно надо явно указать тип аргумента, наример так
Код: Выделить всё
FloatToStr(double(-58.399999999999999))
Аватара пользователя
STAKANOV
энтузиаст
 
Сообщения: 1069
Зарегистрирован: 14.05.2006 21:26:24
Откуда: Зеленоград

Сообщение shade » 22.08.2006 14:38:46

tria писал(а):Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Ну никто не заставляет задавать число знаков после запятой константой, можно формировать форматирующий шаблон в runtime.
IHMO, лутше явно указывать число знаков после запятой..
Аватара пользователя
shade
энтузиаст
 
Сообщения: 879
Зарегистрирован: 21.02.2006 20:15:48
Откуда: http://shamangrad.net/

Сообщение tria » 22.08.2006 15:06:44

STAKANOV писал(а):А это действителдьно так? Т.е проверка проводилась именно


Проверка производилась следующим образом:
Код: Выделить всё
Edit1.Text:=FloatToStr(-58.399999999999999)


И вообще, разница вылезла при тестировании приложения, перенесенного из Делфи.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 22.08.2006 15:11:11

shade писал(а):
tria писал(а):Не подходит. Я заранее не знаю, сколько точек после запятой у меня должно получится.
Ну никто не заставляет задавать число знаков после запятой константой, можно формировать форматирующий шаблон в runtime.
IHMO, лутше явно указывать число знаков после запятой..


У меня - результат вычисления выражения, введенного пользователем.
Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 22.08.2006 16:42:28

>STAKANOV
Сори, чего-то протормозил проверить. Код:
FloatToStr(double(-58.399999999999999))
приводит к тому же результату :(

А может попробовать скопировать целиком дельфовую функцию из исходников? Там вся функция на ассемблере. Только вот не знаю двух вещей:
1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Sergei I. Gorelkin » 22.08.2006 17:21:20

tria писал(а):1. Что за {$IFDEF PIC}? (что такое {$IFDEF} я знаю).
2. Будет ли такой код потом работать под Линуксом (вызовов прерываний в нем нет)?


1. В Дельфи символ PIC определен при компиляции позиционно-независимого кода. Это необходимо для Linux, где не поддерживается таблица релокации. В винде можно и без него, но с ним не повредит - просто объем кода будет чуть-чуть побольше.
2. Заставить код работать под Linux теоретически можно (он ведь в исходном варианте там работает), но сколько на это придется угробить сил - сказать сложно...

А вообще, я бы еще поэкспериментировал с ф-цией FormatFloat. Она дает несколько иные результаты, нежели FloatToStr. Также наблюдается определенная разница между Format('%f', [value]) и Format('%g', [value]).

p.s. 2006 год на дворе, а всю эту хрень с плавающей запятой до сих пор приходится отлаживать с помощью плясок с бубном...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение zub » 22.08.2006 19:41:52

>>Скажем так, что-то наподобие результата вычисления произвольного скрипта. Просчитывать, сколько знаков должен содержать результат - это ой как не просто.
Такого не бывает. что за задача?
В дельфи тоже могут вылести девятки - особенность плавающей запятой
я использую
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;
Последний раз редактировалось zub 22.08.2006 19:50:36, всего редактировалось 1 раз.
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение Sergei I. Gorelkin » 22.08.2006 19:50:29

zub писал(а):а вот так?
function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;


Так пока что нельзя - этот вариант функции еще не реализован...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1405
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение zub » 22.08.2006 19:59:46

>>я использую
>>function FloatToStr(Value: Extended; const FormatSettings: TFormatSettings): string;
Упс.. этот кусок кода закоментирован.... :oops:
zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26

Сообщение tria » 22.08.2006 20:05:34

zub писал(а):>>
Такого не бывает. что за задача?
TFormatSettings): string;

Боюсь, будет как в анекдоте - быстрее наливай, а то сейчас начнется :)
Задача - построение системы учета, в которой пользователь настраивает все - от структуры БД до формул заполнения документов и отчетов.
Соответственно, чего имеет в виду пользователь при построении того или иного выражения, я не знаю.

zub писал(а):В дельфи тоже могут вылести девятки - особенность плавающей запятой
TFormatSettings): string;

Так не вылезали же!
Как я понимаю, в функции FloatToStr в делфях предусмотрена проблема точности.
При чем эту возможность я использовал при сравнении численных величин. Сначала преобразовывал в строку, а затем уже сравнивал.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Stargazer » 23.08.2006 09:12:26

Я использую
Код: Выделить всё
floattostrf(myfloat, FFfixed, 7, 3)
Stargazer
новенький
 
Сообщения: 52
Зарегистрирован: 30.05.2005 09:46:32

Сообщение tria » 23.08.2006 10:18:49

Stargazer писал(а):Я использую
Код: Выделить всё
floattostrf(myfloat, FFfixed, 7, 3)


Повторюсь еще раз. Я НЕ ЗНАЮ, СКОЛЬКО ЗНАКОВ ПОСЛЕ ЗАПЯТОЙ ДОЛЖНО БЫТЬ У ЧИСЛА.
Число - это результат вычисления произвольного математического выражения, заданного пользователем.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

След.

Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 42

Рейтинг@Mail.ru