_Decimal
От: NeoCode  
Дата: 10.02.14 18:39
Оценка:
Прочитал на Википедии про десятичный формат floating point здесь, затем про расширение gcc для этих чисел, решил ради интереса попробовать. Но программа не собирается. Пробовал в Win32 mingw, Linux x64, все равно выдает ошибку, не знает что такое _Decimal32.
int main()
{
 _Decimal32 d;
 return 0;
}

Что нужно для того чтобы это собралось? И есть ли нативная поддержка этого формата в интеловских процах, или предполагается какая-то эмуляция?
Re: _Decimal
От: Lepsik Индия figvam.ca
Дата: 10.02.14 21:58
Оценка:
NC> _Decimal32 d;


__int32 val = 0;
Re[2]: ups. that would work
От: Lepsik Индия figvam.ca
Дата: 10.02.14 22:01
Оценка:
#pragma pack(push,1)
union ParsedFloat
{
    ParsedFloat( float fvalue = 0.0f ) : value(fvalue) {}

    bool IsSign() const { return (integer >> 31) != 0; }              // Portable sign-extraction

    float   value;
    __int32 integer;

    // This is the IEEE 754 single-precision format
    struct ieee_t
    {
#ifdef  BIG_ENDIAN
        unsigned int sign : 1;
        unsigned int exponenta : 8;
        unsigned int mantissa : 23;
#endif
#ifdef  LITTLE_ENDIAN
        unsigned int mantissa : 23;
        unsigned int exponenta : 8;
        unsigned int sign : 1;
#endif
    }ieee;
};
#pragma pack(pop)
Re: _Decimal
От: watchmaker  
Дата: 11.02.14 00:38
Оценка: +1
Здравствуйте, NeoCode, Вы писали:

NC>Прочитал на Википедии про десятичный формат floating point здесь, затем про расширение gcc для этих чисел, решил ради интереса попробовать.

Напрасно :)

NC>Но программа не собирается. Пробовал в Win32 mingw, Linux x64, все равно выдает ошибку, не знает что такое _Decimal32.

Что за ошибка, как собираешь, какой стандарт ты задал компилятору, с какими опциями собран сам компилятор? У меня твой пример вполне себе компилируется, а если добавить вычислений, то и работает.

NC>Что нужно для того чтобы это собралось?

Собственно, нужен gcc с включенной поддержкой и включенными расширениями.

NC>И есть ли нативная поддержка этого формата в интеловских процах, или предполагается какая-то эмуляция?


Поддержки нет и не было. За одним разве что мелким исключением — в x87 есть инструкции по записи или чтению в память числа в bcd представлении. Но, разумеется, вычисления с загруженным таким образом числом происходит совсем не по правилам decimal арифметики.
Ну и вообще, в семействе x86 все следы bcd чисел — это в основном артефакты первых процессоров для микрокалькуляторов, которым поддержка такой функциональности была важна (калькулятор же). Так в более современных x86-64 от части соответствующих инструкций уже окончательно избавились, ибо пользы они практически не несут.
Re[3]: ups. that would work
От: NeoCode  
Дата: 11.02.14 07:19
Оценка:
Здравствуйте, Lepsik, Вы писали:


L>#pragma pack(push,1)

L>union ParsedFloat
L>{
L> ParsedFloat( float fvalue = 0.0f ) : value(fvalue) {}

L> bool IsSign() const { return (integer >> 31) != 0; } // Portable sign-extraction


L> float value;

L> __int32 integer;

L> // This is the IEEE 754 single-precision format

L> struct ieee_t
L> {
L>#ifdef BIG_ENDIAN
L> unsigned int sign : 1;
L> unsigned int exponenta : 8;
L> unsigned int mantissa : 23;
L>#endif
L>#ifdef LITTLE_ENDIAN
L> unsigned int mantissa : 23;
L> unsigned int exponenta : 8;
L> unsigned int sign : 1;
L>#endif
L> }ieee;
L>};
L>#pragma pack(pop)
L>

L>


Это что? Формат float? Я это и сам могу Вы возможно не поняли о чем я спрашиваю.
Насколько я понял, кроме классических float/double типов по основанию 2 (т.е. mantissa * pow(2, exponenta), могут быть еще float/double по основанию 10, т.е. mantissa * pow(10, exponenta). При той же самой записи например число 0.2 невозможно точно представить в Binary float, но можно точно представить в Decimal float. При этом судя по Википедии это не просто какой-то кастомный класс чисел с плавающей точкой, а стандарт IEEE. Поэтому мне интересна именно поддержка на уровне компиляторов, а также насколько данный формат распространен на аппаратном уровне, поддерживают ли его наиболее распространенные процессорные архитектуры (x86, x64, arm).
Re: _Decimal
От: Pavel Dvorkin Россия  
Дата: 12.02.14 15:00
Оценка:
Здравствуйте, NeoCode, Вы писали:

NC>Что нужно для того чтобы это собралось? И есть ли нативная поддержка этого формата в интеловских процах, или предполагается какая-то эмуляция?


Посмотри вот сюда. Может, это оно и есть.

http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library
With best regards
Pavel Dvorkin
Re[4]: ups. that would work
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 13.02.14 18:24
Оценка: 2 (1)
Здравствуйте, NeoCode, Вы писали:

NC> При той же самой записи например число 0.2 невозможно точно представить в Binary float, но можно точно представить в Decimal float. При этом судя по Википедии это не просто какой-то кастомный класс чисел с плавающей точкой, а стандарт IEEE.


Да.

NC> Поэтому мне интересна именно поддержка на уровне компиляторов, а также насколько данный формат распространен на аппаратном уровне, поддерживают ли его наиболее распространенные процессорные архитектуры (x86, x64, arm).


Эти — нет. Аппаратная поддержка из известных мне есть только в IBM z/Architecture, но это даже не офисное решение. Всё — софтом. В дотнете вроде есть на уровне VM.
The God is real, unless declared integer.
Re: _Decimal
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 13.02.14 18:42
Оценка: 2 (1)
Здравствуйте, NeoCode, Вы писали:

NC>Прочитал на Википедии про десятичный формат floating point здесь, затем про расширение gcc для этих чисел, решил ради интереса попробовать. Но программа не собирается. Пробовал в Win32 mingw, Linux x64, все равно выдает ошибку, не знает что такое _Decimal32.


Вот на таком:
$ gcc -v
Using built-in specs.
[...]
Thread model: posix
gcc version 4.7.2 20130108 [gcc-4_7-branch revision 195012] (SUSE Linux)


собралась и работает следующая программа:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
        double ba, bb;
        ba = strtod(argv[1], NULL);
        bb = strtod(argv[2], NULL);
        _Decimal32 a = ba;
        _Decimal32 b = bb;
        _Decimal32 c = a + b;
        printf("%g\n", (double) c);
        return 0;
}


успешно складывает два числа со ввода.

NC>Что нужно для того чтобы это собралось? И есть ли нативная поддержка этого формата в интеловских процах, или предполагается какая-то эмуляция?


В gcc есть файлик config/dfp.m4, в котором сказано включать это:

  case $1 in
    powerpc*-*-linux* | i?86*-*-linux* | x86_64*-*-linux* | s390*-*-linux* | \
    i?86*-*-gnu* | \
    i?86*-*-mingw* | x86_64*-*-mingw* | \
    i?86*-*-cygwin* | x86_64*-*-cygwin*)
      enable_decimal_float=yes
      ;;


Если где-то из таких платформ не работает — значит, явно выключили.
The God is real, unless declared integer.
Re[2]: _Decimal
От: NeoCode  
Дата: 14.02.14 08:56
Оценка:
Здравствуйте, netch80, Вы писали:

N>собралась и работает следующая программа


Спасибо! Оказывается дело было в том, что я пытался компилировать файл с расширением 'cpp', а надо было 'c'. Т.е. в С++ эти штуки не работают. Но мне чисто поиграться, и на Си сойдет
Кстати, еще там есть числа с фиксированной точкой, тоже любопытная и полезная вещь (особенно для микроконтроллеров всяких где нет нативного float).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.