Какой результат получим если разделить int на 0 и float на 0?go-28

В языке 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
}

Результаты:

  1. Положительное число / 0.0 → +Inf (положительная бесконечность)
  2. Отрицательное число / 0.0 → -Inf (отрицательная бесконечность)
  3. 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("Это не число")
    }
    

Почему разное поведение?

  1. Целые числа:

    • Нет концепции бесконечности или NaN
    • Деление на ноль - недопустимая операция
    • Лучше обнаружить ошибку на этапе компиляции
  2. Числа с плавающей точкой:

    • Следует стандарту IEEE 754
    • Позволяет обрабатывать особые случаи
    • Полезно для научных вычислений

Резюмируем

  • int / 0: ошибка компиляции (division by zero)
  • float / 0.0:
    • Положительное / 0 → +Inf
    • Отрицательное / 0 → -Inf
    • 0 / 0 → NaN
  • Проверка особых значений: math.IsInf(), math.IsNaN()
  • Разное поведение обусловлено фундаментальными различиями в представлении целых и вещественных чисел