Почему базовые математические функции не перегружены для разных типов в Java, Math?
У меня действительно интересный вопрос. Недавно я выяснил, что Math.pow() принимает только (double, double) args, и мне интересно, почему нет перегруженных функций с комбинациями других типов, такими как (int, int) или (int, double) atc ...
Я думаю, что это большая дыра и слабость, поэтому я верю, что есть ПРИЧИНА. Кто-нибудь может мне это объяснить, пожалуйста?
Рассмотрим эти два метода:
private int simplePow(int x) {
return x * x;
}
private int harderPow(int x) {
return (int) Math.pow(x, 2);
}
первый намного быстрее второго... проблема в том, что если вы знаете, что вы используете мощность с (int, int), вычисления очень эффективны, и вам не нужно заботиться о проблемах с двойными переменными.
2 ответа
Ну, на самом деле, единственное, о чем вы должны беспокоиться, это (int, int)
перегрузки; другие, которые принимают double
параметр должен привести к double
в любом случае, так что (double, double)
метод будет делать. Так почему же нет (int, int)
перегрузка? Вероятно, потому что возведение в степень растет так быстро, и так как int
Длина всего 32 бита, количество параметров ограничено, так что один из них повышается до другого. double
s имеют гораздо больший диапазон, поэтому у них нет аналогичной проблемы (чтобы быть понятным, двойники тоже могут переполняться, но они могут иметь максимальное значение около 1.8e308; намного больше, чем значение int). Конечно, вы можете реализовать свой собственный метод для получения целочисленной мощности, как это сделано здесь (в принятом ответе используется возведение в степень путем возведения в квадрат, что также может быть применено к (double, int)
дело).
Я не очень разбираюсь в java, но с C++ вы в первую очередь обеспокоены динамическим управлением памятью и перегрузкой при ее запуске и выключении... Я могу сказать, что с точки зрения оптимизации, если методология алгоритма замедлит прогресс система, то вы имеете в виду асимметрию... Тем не менее, меня беспокоит то, что вы правы в вопросе о перегрузке, но если в вашей программе есть другие формы того же вопроса, не лучше всего использовать (лучшие практики), что способ записи результатов для предотвращения ошибок...