🐞reflect: Value.IsZero should report true for negative zero
Довольно интересный баг в реализации reflect.Value.IsZero
который происходит из попытки ответить на вопрос: а что выведет вот такой код?val := math.Copysign(0, -1) // Создаем float64(-0.0)
println(val == 0, reflect.ValueOf(val).IsZero())
Реализация обработки чисел с плавающей точкой внутри IsZero
в версиях 1.21 и ниже вызывает функцию math.Float64bits
и затем сравнивает результат с 0
. Это верно для общего случая, но вот для числа -0
результат вызова этой функции будет совсем не 0
. При этом Go компилятор корректно обрабатывает такое сравнение в обычном коде, что и приводит к разным результатам.
Баг уже исправлен и фикс будет включен в Go 1.22. Так как этот фикс приводит к изменению поведения его скорее всего не будет в багфиксах существующих релизов.
П.С: Про интересное скоро будет, мне пока чудовищно не хватает времени.
>>Click here to continue<<