LINUX.ORG.RU

В джаве слишком много преобразований double->float , float->double ?

 ,


0

4

Раньше когда я говнокодил то по привычке писал float для всех чисел для которых не нужна точность, но потом получалось так что большинство параметров требуют передачи float, а большинство функций возвращают double вместо float, та даже банальная запись дробного числа это дабл. Но вот читаю я сейчас чужой код с которым мне нужно работать и вижу там следующие

bullet.setInertion((float)Math.sin(angle), (float)Math.cos(angle), 0, 0);

Собственно это нормальная штатная ситуация, или же так делать не принято? Тогда какое решение? Вот хоть с данным куском кода, гуглил когда-то Math для фтоатов, нет такого. Переписать класс bullet чтоб он принимал и работал внутри с даблом? А насколько сильно это скажется на производительности?

★★★

Последнее исправление: abs (всего исправлений: 1)

Ответ на: комментарий от BattleCoder

double d = 1.23 , float f = 1.23f

И что? Я шарю это, проблема в функциях которые хотят принимать флоат и большом количестве функций которые возвращают дабл

abs ★★★
() автор топика
Ответ на: комментарий от abs

Просто вы немного ерунду сказали.

запись дробного числа это дабл

Напишите свою реализацию Math.sin/Math.cos, которая работает с float, и сравните результат производительности со стандартными (которые возвращают double с приведением типа к float). И кидайте сюда.

BattleCoder ★★★★★
()
Последнее исправление: BattleCoder (всего исправлений: 1)

А что, в джаве нет дженериков?

template <typename Number>
Number min(Number num1, Number num2) {
    if (num1 >= num2) {
        return num1;
    }
    return num2;
}

hlebushek ★★
()
Ответ на: комментарий от hlebushek

Ты затронул самые больные мозоли жавистов:

- для примитивных типов нету женериков

- для оберток над примитивами женерикр работаю как и для всего - тупо расставляя приведение типов

- обертки для примитивов... ааа занимают лишнюю память, пэтому например обертки для int от [-128, 127] кешируются в костыльном массиве.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)

Если тебе нужна скорость, то напиши имплементацию синуса сам или найди какую-нибудь готовую [1]. Учти, что стандартная имплементация гарантирует точностью 1 ulp, да еще и в double, которая обычно тебе не нужна. Алсо, считай сразу синус и косинус, это намного быстрее. Ну и не забывай про вред преждевременной оптимизации, т.к. пока что не понятно, нужно ли тебе вообще что-либо тут оптимизировать.

[1] Не знаю имплементации для джавы, но для C есть есть хорошая либа VDT. Спортировать оттуда синус-косинус элементарно: https://svnweb.cern.ch/trac/vdt/browser/trunk/include/sincos.h Правда, скорость VDT вряд ли перенесется в C, т.к. джава пока что плохо умеет в автовекторизацию, на которую рассчитывает эта либа.

trycatch ★★★
()
Последнее исправление: trycatch (всего исправлений: 1)
Ответ на: комментарий от BattleCoder

Напишите свою реализацию Math.sin/Math.cos, которая работает с float

Речь не о тригонометрии вовсе)

abs ★★★
() автор топика

Приведение типов? А что здесь не так? В примере выше инерция пуль принимает аргументы float, в то время как используемые функции синуса и косинуса возвращают double: приводим к float. Но раз повышенная точность не нужна, я бы оптимизировал эти тригонометрические функции до старого способа: таблица.

kalterfive ★★
()
Ответ на: комментарий от kalterfive

Приведение типов? А что здесь не так?

Так я вот и спрашиваю, все ли здесь так? Просто меня эти скобки очень бесят. Почему java не сделала автоматом приведение double к float в таких функциях, не было бы этого награмаждения

abs ★★★
() автор топика
Ответ на: комментарий от backburner

http://stackoverflow.com/questions/15143735/using-floatmath-or-math-and-a-cast

Ух ты, я не знал. Хотя, для GPU разница между single precision и double большая: http://stackoverflow.com/questions/2079906/float-vs-double-on-graphics-hardware (старая статья, но большинство выводов всё ещё верные).

Я ожидал увидеть нечто подобное на мобильниках. Логика такая: раз любой SoC имеет видеокарту то логично переложить вычисления с плавающей запятой на неё. Но, видимо, всё же FP-блоки у CPU ядер пока свои.

Кстати, а внутри этих SoC FPU unit поддерживает 80bit (extended precision)?

true_admin ★★★★★
()
Ответ на: комментарий от abs

Почему java не сделала автоматом приведение double к float в таких функциях, не было бы этого награмаждения

потому что

possible lossy conversion from double to float
Если не хочешь нагромождения скобочек - напиши обертку над Math, которая будет делать каст у себя внутри, а тебе выдавать уже float. На производительности это не скажется - обертка заинлайнится jit-ом.

maloi ★★★★★
()
Ответ на: комментарий от maloi

100% что в фрэймворке что он юзает уже есть класс типа FastMath.. ТС просто поленился изучуть пакет *.math

ii8_ ★★★★
()

Зачем тебе float-ы вообще? Используй double.

Если float нужен, пиши как написал. Наверняка JVM сообразит и оптимизирует этот код как положено.

Legioner ★★★★★
()
Ответ на: комментарий от abs

автоматом приведение double к float

Неявное приведение типов с потерей точности должно давать как минимум warning, иначе можно сесть в лужу с размаху очень быстро

Pinkbyte ★★★★★
()
Ответ на: комментарий от ii8_

100% что в фрэймворке что он юзает уже есть класс типа FastMath

Да причем тут fastMath? Это libGDX и там очень мало чего есть, самое мизер. Я глобального говорю об этой проблеме

abs ★★★
() автор топика

Зачем тебе float? Используй double. На производительности никак не скажется. Не придумывай проблемы там, где её нет.

anonymous
()

Собственно это нормальная штатная ситуация, или же так делать не принято?

Нормальная штатная ситуация для работы с графикой. Если методы твои то заведи две функции одна с double, другая с float параметрами и там кастай.

vtVitus ★★★★★
()
Ответ на: комментарий от abs

. Почему java не сделала автоматом приведение double к float в таких функциях,

А зачем это ей приводить double к float? тут проблема скорее в bullet.setInertion((float), (float)); зачем это этой тупой функции понадобили аргументы в float если достаточно в double? какой таджик это писал?

Karapuz ★★★★★
()
Ответ на: комментарий от anonymous

Зачем тебе float? Используй double.

Ну, он взял чью-то либу явно

Karapuz ★★★★★
()

Я так понял ТСа просто бесят скобки и то, что самому нужно думать о приведении типов.

Не нравится синтаксис и правила языка - иди на другой, делов то :)

Я сейчас на вскидку тебе не вспомню - но точно знаю что приведение типов нужно, потому как есть нюансы там с интерфесами например. Интерфесы могут например принять, что угодно на вход (если так разработаны конечно), а по типу данных отправить на нужную (оптимальную) функцию.

Поверь - эту хрень не просто так придумали, как в принципе и всеми ламерами «любимый» goto. Ламерами, которые никогда не писали свои собственные реализации высокопроизводительных алгоритмов.

Serg_HIS
()
Ответ на: комментарий от Serg_HIS

Не нравится синтаксис и правила языка - иди на другой, делов то :)

Дак куда ж я с джавы под андроид то уйду?(

abs ★★★
() автор топика

Ну и перегружение функций тоже никто не отменял.

Есть анпример в классе фукция с флоат и с дабл, что вписал - та функция и приняла.

Serg_HIS
()
Ответ на: комментарий от true_admin

Я ожидал увидеть нечто подобное на мобильниках.

На железках с softfloat будет именно так

Логика такая: раз любой SoC имеет видеокарту то логично переложить вычисления с плавающей запятой на неё. Но, видимо, всё же FP-блоки у CPU ядер пока свои.

Нелогично, гонять данные по шине было бы намного медленнее softfloat

annulen ★★★★★
()
Ответ на: комментарий от annulen

гонять данные по шине было бы намного медленнее softfloat

Я думаю, в пределах одного кристалла это всё можно хорошо заоптимизировать.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.