Extended и Comp: они вообще поддерживаются?
Модератор: Модераторы
Extended и Comp: они вообще поддерживаются?
Намедни ковырял свою перзистентную систему. Когда пытался прочитать 64-битном модуле сессию, записанную 32-битным - парсер душераздирающе кричал про неизвестные неподдерживаемые типы extended и comp. Я эту байду не использую, поддержку в своё время добавлял просто шоб было.
Стало интересно, запустил дебажную версию. В логах в том месте, где должны регистрироваться эти два типа - ничего. А это может значить только одно: они уже зарегистрированы под другим именем.
И вот я офигеваю: что, под x86_64 extended и comp - это и правда лишь алиасы double?
А как же совместимость бинарных файлов?
Стало интересно, запустил дебажную версию. В логах в том месте, где должны регистрироваться эти два типа - ничего. А это может значить только одно: они уже зарегистрированы под другим именем.
И вот я офигеваю: что, под x86_64 extended и comp - это и правда лишь алиасы double?
А как же совместимость бинарных файлов?
extended - решение в пользу аппаратной поддержки и делфи совместимости?
а
comp всегда был 64-битным. это ж интеджер!
ты о чём? процессоры же разные (32 vs 64) (нету же бинарной совместимости межу little-endian и big-endian процессорами)
на single и double, т.е float-point - есть стандарт.
А вот на 80 битовый extended стандарта вроде как нет?
а
comp всегда был 64-битным. это ж интеджер!
Cheb писал(а):А как же совместимость бинарных файлов?
ты о чём? процессоры же разные (32 vs 64) (нету же бинарной совместимости межу little-endian и big-endian процессорами)
на single и double, т.е float-point - есть стандарт.
А вот на 80 битовый extended стандарта вроде как нет?
Понятненько. То есть в 32-битной версии эти мощи сохраняются чисто для поддержки древнекода из дельфи и турбо паскаля, а на остальных платформах - "извиняйте"?..
Разумно.
Вырезаю из своего игрового движка поддержку extended, ибо нефиг.
Разумно.
Вырезаю из своего игрового движка поддержку extended, ибо нефиг.
скалогрыз писал(а):на single и double, т.е float-point - есть стандарт. А вот на 80 битовый extended стандарта вроде как нет?
Но ведь ряд процессоров поддерживает 80 битовый extended. И если для какой-то задачи требуется точность именно 80 битовый extended, то придется отказывать от FreePascal?
А что вам мешает сделать собственный тип. Можете сделать с любой точностью.
Extended серьезно не поддерживается? Любопытные сказки.
Linux, x86-64, fpc 3.0
программа 1.pp:
компилируем fpc -al 1.pp
запускаем ./1
видим:
для очистки совести смотрим в 1.s
видим:
читаем про fldt и 80-битный вещественный тип: https://sourceware.org/binutils/docs/as ... Float.html
comp можете проверить аналогично.
Добавлено спустя 2 минуты 29 секунд:
И, кстати, comp тоже матсопроцессором обрабатывается.
Linux, x86-64, fpc 3.0
программа 1.pp:
Код: Выделить всё
var x:extended;
i:integer;
begin
writeln(sizeof(x));
x:=1e3000;
writeln(x);
for i:=1 to 10 do
x:=x/10;
writeln(x);
end.компилируем fpc -al 1.pp
запускаем ./1
видим:
Код: Выделить всё
10
9.99999999999999999986E+2999
9.99999999999999999986E+2989
для очистки совести смотрим в 1.s
видим:
Код: Выделить всё
...
# [8] x:=x/10;
fldt U_$P$PROGRAM_$$_X
fldt _$PROGRAM$_Ld2
fdivrp %st,%st(1)
fstpt U_$P$PROGRAM_$$_X
cmpw $10,U_$P$PROGRAM_$$_I
jl .Lj31
...читаем про fldt и 80-битный вещественный тип: https://sourceware.org/binutils/docs/as ... Float.html
comp можете проверить аналогично.
Добавлено спустя 2 минуты 29 секунд:
И, кстати, comp тоже матсопроцессором обрабатывается.
К сожалению, он может поддерживаться хоть до посинения, но RTTI это глубоко до лампочки: в 64-битном режиме TypeInfo(extended) возвращает значение, идентичное TypeInfo(double).
Моя перзистентная система просто не может знать о таком типе. Никак.
d:\chentrah\modules\tests>c:\fpc\2.6.4\bin\i386-win32\fpc extended.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.4 sec , 60368 bytes code, 12892 bytes data
d:\chentrah\modules\tests>extended
0041078C
00410798
d:\chentrah\modules\tests>c:\fpc\2.6.4\bin\i386-win32\ppcrossx64 extended.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.4 sec , 74160 bytes code, 19604 bytes data
d:\chentrah\modules\tests>extended
00000001000148E0
00000001000148E0
d:\chentrah\modules\tests>c:\fpc\3.0.0\bin\i386-win32\fpc extended.pas
Free Pascal Compiler version 3.0.0 [2015/11/16] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.7 sec, 64848 bytes code, 4148 bytes data
d:\chentrah\modules\tests>extended
00413220
00413230
d:\chentrah\modules\tests>c:\fpc\3.0.0\bin\i386-win32\ppcrossx64 extended.pas
Free Pascal Compiler version 3.0.0 [2015/11/16] for x86_64
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.7 sec, 71440 bytes code, 4980 bytes data
d:\chentrah\modules\tests>extended
0000000100015280
0000000100015280
Моя перзистентная система просто не может знать о таком типе. Никак.
Код: Выделить всё
{$mode objfpc}
{$longstrings on}
program extest;
uses sysutils, typinfo;
begin
WriteLn(IntToHex(ptruint(typeinfo(double)), sizeof(pointer) * 2));
WriteLn(IntToHex(ptruint(typeinfo(extended)), sizeof(pointer) * 2));
ReadLn;
end.d:\chentrah\modules\tests>c:\fpc\2.6.4\bin\i386-win32\fpc extended.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for i386
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.4 sec , 60368 bytes code, 12892 bytes data
d:\chentrah\modules\tests>extended
0041078C
00410798
d:\chentrah\modules\tests>c:\fpc\2.6.4\bin\i386-win32\ppcrossx64 extended.pas
Free Pascal Compiler version 2.6.4 [2014/03/06] for x86_64
Copyright (c) 1993-2014 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.4 sec , 74160 bytes code, 19604 bytes data
d:\chentrah\modules\tests>extended
00000001000148E0
00000001000148E0
d:\chentrah\modules\tests>c:\fpc\3.0.0\bin\i386-win32\fpc extended.pas
Free Pascal Compiler version 3.0.0 [2015/11/16] for i386
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.7 sec, 64848 bytes code, 4148 bytes data
d:\chentrah\modules\tests>extended
00413220
00413230
d:\chentrah\modules\tests>c:\fpc\3.0.0\bin\i386-win32\ppcrossx64 extended.pas
Free Pascal Compiler version 3.0.0 [2015/11/16] for x86_64
Copyright (c) 1993-2015 by Florian Klaempfl and others
Target OS: Win64 for x64
Compiling extended.pas
Linking extended.exe
11 lines compiled, 0.7 sec, 71440 bytes code, 4980 bytes data
d:\chentrah\modules\tests>extended
0000000100015280
0000000100015280
Что тут сказать?
Итого - под Win64 extended отсутствует (по всей видимости, это такая особенность платформы). Как-то я тоже на это обращал внимание, читал что-то. Бороться бесполезно, по крайней мере, пока. Под Linux (и другими nixами) работает вполне штатно.
Код: Выделить всё
[vvi@comp1 tmp]$ fpc extended.pas
Free Pascal Compiler version 3.1.1 [2017/01/22] for x86_64
Copyright (c) 1993-2017 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling extended.pas
Linking extended
8 lines compiled, 0.4 sec
[vvi@comp1 tmp]$ ./extended
0000000000673090
00000000006730A0
Итого - под Win64 extended отсутствует (по всей видимости, это такая особенность платформы). Как-то я тоже на это обращал внимание, читал что-то. Бороться бесполезно, по крайней мере, пока. Под Linux (и другими nixами) работает вполне штатно.
-
MylnikovDm
- постоялец
- Сообщения: 103
- Зарегистрирован: 15.02.2007 20:26:10
- Откуда: Челябинск
Extended работает только на 80х86 процессорах в 32 разрядном режиме. Для других процессоров и режима x64 для Intel/AMD тип extended является псевдонимом типа double, а в некоторых случаях даже типа single.
Так что я сильно сомневаюсь, что под nix'ами у вас extended работает штатно в х64 режиме. Скорее всего вы просто не проверяли, есть ли разница между extended и double.
Так что я сильно сомневаюсь, что под nix'ами у вас extended работает штатно в х64 режиме. Скорее всего вы просто не проверяли, есть ли разница между extended и double.
