В языке Go поведение при делении на ноль отличается для целочисленных типов и чисел с плавающей точкой. Давайте разберем оба случая подробно.
1. Деление целого числа на ноль
package main
func main() {
var x int = 5
y := x / 0 // Ошибка компиляции
}
Результат:
- Ошибка компиляции:
division by zero
- Go не позволяет скомпилировать код с целочисленным делением на ноль
- Это статически обнаруживаемая ошибка на этапе компиляции
Объяснение:
- Целочисленное деление на ноль не имеет математического смысла
- В процессорах такое действие вызывает аппаратное прерывание
- Go предотвращает эту ситуацию на этапе компиляции
2. Деление float на ноль
package main
import (
"fmt"
"math"
)
func main() {
var a float64 = 5.0
b := a / 0.0
fmt.Println(b) // Выведет: +Inf
c := -a / 0.0
fmt.Println(c) // Выведет: -Inf
d := 0.0 / 0.0
fmt.Println(d) // Выведет: NaN
}
Результаты:
- Положительное число / 0.0 →
+Inf
(положительная бесконечность)
- Отрицательное число / 0.0 →
-Inf
(отрицательная бесконечность)
- 0.0 / 0.0 →
NaN
(Not a Number)
Объяснение:
- Спецификация IEEE 754 определяет поведение операций с плавающей точкой
- В Go есть специальные значения:
math.Inf(1)
- положительная бесконечность
math.Inf(-1)
- отрицательная бесконечность
math.NaN()
- не число
- Эти значения можно проверять:
if math.IsInf(b, 1) {
fmt.Println("Это +бесконечность")
}
if math.IsNaN(d) {
fmt.Println("Это не число")
}
Почему разное поведение?
-
Целые числа:
- Нет концепции бесконечности или NaN
- Деление на ноль - недопустимая операция
- Лучше обнаружить ошибку на этапе компиляции
-
Числа с плавающей точкой:
- Следует стандарту IEEE 754
- Позволяет обрабатывать особые случаи
- Полезно для научных вычислений
Резюмируем
- int / 0: ошибка компиляции (division by zero)
- float / 0.0:
- Положительное / 0 → +Inf
- Отрицательное / 0 → -Inf
- 0 / 0 → NaN
- Проверка особых значений:
math.IsInf()
, math.IsNaN()
- Разное поведение обусловлено фундаментальными различиями в представлении целых и вещественных чисел