Методы математической библиотеки на языке программирования Google Go

9

Я программировал в google Golang и получал удовольствие от его краткости, но я нахожу удивительным, что почти все его стандартные методы библиотеки Math предназначены для типа с плавающей запятой. Есть ли какая-то особая причина, почему эти методы не существуют для целых?

Cobie
источник

Ответы:

9

Короткий ответ: Go является преемником C, и стандартная математическая библиотека C также определяется почти исключительно в терминах значений с плавающей запятой одинарной и двойной точности.

Более длинный ответ заключается в том, что в статически типизированном языке без полиморфизма или перегрузки функций, таких как Go (или C), вам нужно выбрать тип для функции, которую нужно взять и вернуть заранее, и как только вы собираетесь иметь дело с Для определенных типов в вашей математической библиотеке, есть гораздо более интересные операции над числами с плавающей запятой, чем целые числа. Чтобы выбрать несколько примеров

  • квадратный или n-ный корень из целого числа или числа с плавающей запятой обычно не представляется как целое число

  • очень немногие интересные значения трансцендентных функций представляются в виде целых чисел

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

Обратите внимание, что это не так обременительно, как может показаться, если ваши входные значения являются целыми числами - целочисленное значение может быть преобразовано в значение с плавающей запятой с простой типизацией и, в основном, точно.

Это история для таких языков, как Go или C. У других языков есть и другие варианты:

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

  • Язык с перегрузкой функций может предоставлять несколько версий одной и той же функции в зависимости от передаваемых вами типов (строго говоря, это несколько функций с одинаковым именем, в отличие от случая с динамически типизированным выше)

  • Язык с полиморфизмом типов (например, объектно-ориентированные языки с наследованием) может определять суперкласс «Число» с подклассами для целых чисел и значений с плавающей запятой, а затем определять математические функции в терминах этого класса Number. Этот подход имеет большую гибкость подхода динамического языка, сохраняя при этом большую часть строгости статического подхода или подхода с перегрузкой функций.

Однако у Go нет ни одной из этих функций.

jimwise
источник