LINUX.ORG.RU

Арифметика для разных числовых типов.

 


0

1

Тут вот был аналогичный вопрос, по мотивам его вспомнилось.

У нас была задача - интерпретатор скриптового языка на java, вопрос фигня, но типы если целые то и должны оставаться целыми, с другой стороны неявное преобразование типов. Ну и использовать везде Long вместо целых нельзя.

Сделано было так:

// создавалась пачка "операторов" 
// для каждого поддерживаемого типа:
mathOp(Integer l, Number r);
mathOp(Long l, Number r);
mathOp(Float l, Number r);
mathOp(Double l, Number r);

для упрощения правый аргумент приводится к типу левого, костыльно да.

Так вот вопрос, можно ли решить сию задачу элегантнее?

Deleted

из википедии:

В языке Java действуют следующие правила:
Если один операнд имеет тип double, другой тоже преобразуется к типу double.
Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
Иначе оба операнда преобразуются к типу int.

Чем не годится? Можно и вручную для ваших типов реализовать.

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

Чем не годится?

Тем что ты процитировал поведение компилятора, а в сабже он не при делах.

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

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

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

в сабже описано что именно это и реализовано
для упрощения правый аргумент приводится к типу левого, костыльно да.

Если я вас правильно понял, нет.

sevenredlines
()

Я бы к double кастовал всё и потом назад к нужному типу. Только для long-а этого не хватит, а с другой стороны так уж он вам нужен, этот лонг?

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

Ты нас (ээ я тут один же) неправильно понял с первого поста.

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

А если я вас правильно понял со второй попытки, то вы имеете в виду, что поведение как в Java, и при использовании описанных вами функций аргументы меняются местами правильным образом. Тогда мне добавить нечего.

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

В лонге иногда бывают айдишники из субд и время 8)

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

тоже что и в яве, только в яве ничего не менятся, там

1 + (int)2.0

и

1.0 + (double)2

делает компилятор

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

ну да, это я описал поведение сабжа, в яве тип приводится к более общему, но значения это не имеет в данном случае т.к. все равно надо рисовать по куче операций на тип

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

А как же неточности при работе с даблами?
Как минимум ситуацию 1(int) == 1(long) так обрабатывать некорректно.

Aswed ★★★★★
()

Если один операнд имеет тип double, другой тоже преобразуется к типу double.
Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.
Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.
Иначе оба операнда преобразуются к типу int.

Тут не написано «если первый». Тут написано «если один». Так что ты сделал не совсем правильно. А «элегантнее» эту задачу не решить.

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

Для 32 битов точности double хватает, чтобы без ошибок представлять все числа, поэтому можно считать, что int это подмножество double. Вот для 64 битов, конечно, не хватит.

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

Ну если для тебя такое поведение:

1(int) + 1.5(float) = 2(int)
1.5(float) + 1(int) = 2.5(float)
Корректно, то да «не так как принято». По-моему нарушения математического правила «a+b = b+a» есть некорректное поведение.

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

нарушения математического правила «a+b = b+a»

"1" + 2 = ? 

2 + "1" = ?

а потом расскажи про «математические правила» в ЯП.

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

Тут уже не работа с числами. А в работе с числами следует придерживаться математических абстракций.

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

Тут уже не работа с числами. А в работе с числами

в копьютере есть такая штука как типы данных, если ты не заметил, в упомянутых тобой «математических абстракций» сей момент не затронут.

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

Нутыпонел. Я к тому, что математические операции, а операции с числами все таки математические, нужно делать как можно ближе к математике.

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