2016-02-03 3 views
2

Есть ли способ создать новый тип данных, где я определяю количество бит и арифметические правила в Scala? У меня есть программа, которая использует 32-битные поплавки, но я пытаюсь изучить, как повлияет на результаты.Как определить новый тип примитивных данных и его поведение в Scala

Я хочу переписать программу для добавления и умножения чисел с фиксированной точкой (d.f) и вернуть числа с фиксированной точкой с той же точностью (d.f, а не d1 + d2.f1 + f2). Кроме того, я хочу иметь насыщенность, чтобы при переполнении результат зависел от максимального значения, а не от обертывания. Я также хочу усечь биты, если есть underflow.

Из того, что я понимаю, только 8-битное число является коротким, а единственными десятичными числами являются поплавки и парные. Могу ли я каким-то образом определить этот тип данных в Scala или это единственный способ сделать регулярную арифметику float и округлить до ближайшего числа, которое может быть представлено моим желаемым типом?

Благодаря

ответ

1

Вы бы ограничены, какие типы вашей виртуальной машины Java обеспечивает и поддерживает, если вы идете и взломать JVM, или скомпилировать Scala в машинный код с некоторыми пользовательскими настройками компилятора.

Более разумный подход для достижения этого - хранить ваши числа как фракции. Есть несколько библиотек, таких как Spire, которые позволяют вам это делать. С Spire вы также можете выбрать Double или Rational скорость/точность обмена.

1

Вы не можете определить примитивный тип данных. Но в Scala вы можете определить value class, например. class FixedPoint(x: Long) extends AnyVal. Во время выполнения он будет в большинстве случаев (но не всегда!) Представлен как Long.

Хотя Spire, упомянутый в другом ответе, есть FixedPoint type, он говорит:

Этот класс использует значение Длинный с неявным знаменателем. Сам тип не содержит информации о знаменателе. Вместо этого требуется неявный экземпляр FixedScale, чтобы обеспечить этот контекст, когда это необходимо (например, при умножении). Как и предыдущие значения без знака, значения фиксированной точки не будут помещаться в большинстве случаев.

Этот тип предназначен для решения определенного типа проблем и должен использоваться только в ситуациях, когда требуется большое количество рациональных чисел с одним и тем же знаменателем, а эффективность очень важна.

Я также не думаю, что его операции насыщены (хотя я не уверен).