Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Float2Str [Delphi, Windows]


Dimaxx ©   (22.03.20 18:38

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

Есть ли для КОЛа нормальный сабж? Extended2Str и прочие в КОЛе переводят большие числа в неэкспоненциальный формат. Format использует обрезок без поддержки плавающих форматов. Str из System неудобна для целых чисел. Помню писал замену Format на _vsnprintf, но нормальной работы не смог добиться опять-таки для плавающего формата. Выдирать из SysUtils тонны зависимого кода тоже нет желания.


dmk ©   (23.03.20 17:01[1]

Писал давно такую функцию. Можете доработать под себя:
http://forum.delphimaster.net/cgi-bin/forum.pl?id=1492345608&n=3


Dimaxx ©   (24.03.20 09:10[2]

Благодарю. Вечером уволоку, покопаюсь. Я уже набросал на асме double2str, вроде работает, но не справляется с простыми числами типа 1.77. С большими работает на ура.


dmk ©   (24.03.20 09:59[3]

У меня корректно работает со всем диапазоном Double.


Dimaxx ©   (25.03.20 00:35[4]

Все оказалось банальнее:

function _gcvt(value: double; digits: integer; buffer: PAnsiChar): PAnsiChar; cdecl; external 'msvcrt.dll';

function Double2Str(D: double): string;
var Buf: array[0..1023] of char;
begin
 _gcvt(D,15,@Buf[0]);
 Result:=Buf;
end;


правда работает только с double, extended не катит.


Dimaxx ©   (25.03.20 00:53[5]

var Buf: array[0..31] of char; вполне достаточно


Vladimir Kladov ©   (11.01.21 04:34[6]

К сожалению, 1.538e-14 превратилось в 1,53E-014
Не совсем чтобы в тыкву, но меня не устраивает.

В функции Extended2Str есть баг: при включенном символе PAS_ONLY не работает основной код цикла. Правильный код должен быть такой:

 while TRUE do
 begin
   {$IFDEF PAS_ONLY}
   if TRUNC(Abs(E)) >= 10000000 then
      break;
   {$ENDIF} // было {$ELSEIF}
   asm
     FLD    [E]
     FBSTP  [Buf1]
   end;
   if Buf1[ 7 ] <> 0 then break;
   //{$ENDIF}
   E := E * I10;
   Dec( N );
 end;


Можно внести исправление в KOL.pas, или скопировать код всей функции в свой.


Dimaxx ©   (11.01.21 10:38[7]

А что именно не устроило? Округление или ноль после Е?


Dimaxx ©   (11.01.21 11:56[8]

Кстати, Double2Str/Extended2Str работают неверно с числами с плавающей точкой. И _gcvt также неверно преобразует число в строку. К примеру:

Число: 3.1415926535897932384626433832...
Представление в формате IEEE-754: 3.14159265358979311599796346854E0
Вывод KOL: 3.1415927410125732
Вывод _gcvt: 3.1415927410125732

Причем если в _gcvt/Double2Str передать в качестве аргумента непосредственно константу PI, то вывод правильный. Хотя D:=PI и Double2Str(D)  ломает вывод. В памяти оба варианта верные: $400921FB и $54442D18.

Число: 3.1415926535897E+24
Представление в формате IEEE-754: 3.14159265358969997099008E24
Вывод KOL: 3141592637369060000000000
Вывод _gcvt: 3.1415926373690597e+024


Dimaxx ©   (11.01.21 16:09[9]

Перепутал double с single...


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо