Pull to refresh

Comments 11

Не понятно, почему упор в статье сделан именно на Go? Суть float не изменится, если заменить Go на любой другой ЯП на слуху.

Думаю, эта тема есть в школьном курсе информатики. Спросил у ИИ. Он ответил, что да, есть, но не во всех учебниках.

Хотелось бы добавить, что есть такая наука как Численные методы, рассматривающая некоторые гарантии при вычислениях с плавающей точкой.

Также надо понимать, что любое число с плавающей точкой - по прежнему остаётся некоторым набором бит. Скажем, 32 или 64 бит. А это влечет за собой вполне конечное количество состояний, в котором может находиться данный набор бит. А конечное количество состояний влечет за собой ограниченное количество возможных действительных чисел, представимых с помощью данного числа с вещественной точкой. Тогда как в математике - множество всех вещественных чисел бесконечно, причём даже не счетно - а является континуумом. Т.е. мощность множества вещественных чисел превосходит мощность множества целых чисел.

Далее, для вычислений с числами с плавающей запятой, не требуется обязательное наличие аппаратной поддержки данных вычислений. Т.е. специализированного FPU. Вполне реальны вычисления с плавающей запятой на процессорах, не обладающих FPU. В данном случае, речь идёт о так называемой software floating point. Примером библиотеки для таких вычислений можно назвать GNU software floating point library.

В данном случае, речь идёт о так называемой software floating point. Примером библиотеки для таких вычислений можно назвать GNU software floating point library.

Олды вспомнят опцию x87 emulation в Turbo Pascal for DOS. Позволяло работать с плавающей арифметикой во времена 286/386, у которой встроенных сопроцессоров не было(но были варианты с внешними чипами x87).

В наше время отсутствие FPU встречается в микроконтроллерах, например довольно распространённом и дешёвом STM32F103.

Я видел вычисления с софтверной плавающей точкой под Z80. Процессоре, что даже умножать и делить не умеет. Не то, что плавающую точку аппаратно обеспечивать.

Ещё, вычисления с софтовой плавающей точкой позволяют оперировать числами просто гигантской разрядности, и соответственно точности.

Если скажем для x86 процессоров внутренняя разрядность вещественного числа в FPU - 80 бит, и это максимально достижимая разрядность аппаратно поддерживаемых вычислений. То для софтовой плавающей точки возможны и 256 бит разрядности, и 1024 бита, и даже больше.

Зависит от количества выводимых знаков. Не знаю как там в Го и PHP, а в Си при выводе printf по-умолчанию 6 разрядов и вот такой код

#include <stdio.h>

int main()
{
	volatile float a = 0.1;
	volatile float b = 0.2;
	printf("%f %.15f\n", a + b, a + b);
	volatile double x = 0.1;
	volatile double y = 0.2;
	printf("%f %.30f\n", x + y, x + y);
}

Выведет по-умолчанию ровно 0.3, но если увеличить разрядность станет заметно отклонение:

0.300000 0.300000011920929
0.300000 0.300000000000000044408920985006

Попробуй

php -r "echo floor((0.1+0.7)*10);"

По чистой математике должно получиться 8, а PHP выведет 7.

Поэтому в браузере есть величина Number.EPSILON, чтобы сравнивать.

Опять банальщина, не имеющая отношения к Go как таковому. Все современные языки с IEEE 754 с float работают одинаково. Вместо этого можно было бы про пакет math/big рассказать. Но зато плюсиков заработали...

Вопрос, который меня мучает постоянно, когда приходится работать с большими числами - почему в стандартной библиотеке есть bigmath, но нет встроенного типа float128. В большинстве других языков он есть, а в go не хотят его вводить.

Sign up to leave a comment.

Articles