Есть ли уже доступный способ сделать это и позаботиться о проблемах усечения/переполнения (недо)потока?
Это зависит от того, как вы хотите решить эти проблемы. Кажется, вы предлагаете рассматривать значения byte
как масштабированные значения. Теперь в Java нет встроенной поддержки масштабированных чисел, поэтому вам придется тщательно выполнять арифметические действия... самостоятельно заботясь об усечении, потере значимости и настройке масштаба.
Это можно сделать... если вы будете осторожны.
Но стоит ли?
Первое, что нужно учитывать, это то, что поле byte
или локальная переменная занимает точно такое же пространство, как поле int
или float
... 32 бита. (Или потенциально больше на 64-битной машине.)
На самом деле вы сэкономите память только в том случае, если байты на самом деле являются членами byte[]
.
Затем вы должны спросить себя, действительно ли усилия по уменьшению пространства того стоят. Вы измерили, сколько будет этих масштабированных байтовых значений? Вы сравнивали это с другим использованием памяти в вашем приложении? Вы хоть знаете, сколько из этих масштабированных байтовых значений нужно представить?
Я также хочу избежать как можно больших вычислительных накладных расходов, потому что эти значения также будут задействованы во многих вычислениях.
Вот в чем проблема. Арифметика с масштабированными значениями потребует дополнительных инструкций, особенно если вы хотите обнаружить переполнение/недополнение. Это, как правило, замедляет работу вашего приложения.
Я был бы склонен реализовать приложение, просто используя float
, который автоматически позаботится обо всех проблемах переполнения и потери значимости. Затем запустите приложение на реальных данных, чтобы увидеть, насколько оно быстрое и сколько памяти оно использует:
- Если оба варианта приемлемы, оставьте их в покое.
- If memory usage is too great or speed are too slow, THEN look at ways to fix this. If you decide to try the scaled number approach:
- implement the key computations using
float
and byte
- тест, чтобы исправить масштабированный арифметический код, и
- тщательно сравните обе версии, чтобы оценить различия.
Я не могу предсказать, какие будут результаты. Но я могу сказать вам, что многие люди тратят время на оптимизацию кода, который не нуждается в оптимизации. Не совершайте эту ошибку — не оптимизируйте преждевременно.
person
Stephen C
schedule
17.02.2013