Типы с фиксированной точкой (fixed-point types)

mezastel
mezastel

Знаете когда вы изучаете новый язык, вроде С++, и вам показывают template <typename T> class Rational { T numerator, denominator; } и потом там всякие операции? Ну на самом деле это все есть в CAS системах. Серьезно, format rat в MATLAB -- это как раз оно.

Но мы не о дробях а о детерминизме в вычислениях. Например, в работе с FP (floating point), в итеративных алгоритмах компиляторы ведут себя по-разному, и в результате точность сравнений нужно подкручивать, потому что MSVC и Intel C++ порой дают разные результаты.

Обычно FixP (fixed point) - это просто пара интов, например struct FP64 { int whole, fractional; }. Мы все плодим такой самопал, но веселье начинается тогда, когда тебе нужны например конверсионные операции. Также, как вы понимаете, этот подход негикий, т.к. по идее нужно иметь что-то вроде fixed_t<I,F> который поддерживает абсолютно все операции: арифметику, сдвиги, конверсию в/из FP. И еще поддержку SIMD и подобных вещей.

И конечно хочется как минимум <cmath> для FixP чтобы не заниматься самопалом. Понятно что есть некоторые последствия у этого т.к. в отличии от FP процессоры не оптимизируют подобные операции так что, возможно имеет смысл делать конверсию в FP и назад?

Еще одна побочная цель - это объяснить людям зачем FixP вообще нужно. Есть впечатление, что за пределами accounting'а и игр никому оно не надо.

14
рейтинг
3 комментария
yndx-antoshkka
Посмотрите пожалуйста предложение open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3611.html

Это решение вас устроит? Есть ли в нём какие-либо недочёты?
yndx-antoshkka
mezastel
yndx-antoshkka, нет, это совсем другое. я не хочу класс rational (дробь), я хочу fixed-point типы. это абсолютно разные вещи. rational приведен только в качестве примера.
mezastel
mezastel
Вот более релевантный пропозл open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3352.html
mezastel
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).