Числа с плавающей точкой.
#1

Приветствую. Первый раз столкнулся с такого рода проблемой.
Строка:
pawn Код:
printf("%f | %f | %f | %f | %f | %f",10.1,20.1,30.1,40.1,50.1,60.1);
Выводит результат:
Код:
10.100000 | 20.100000 | 30.100000 | 40.099998 | 50.099998 | 60.099998
Первые три значения выводятся корректно, последние три - нет.
Почему?
Reply
#2

По дефолту %f ставит 6 чисел после точки. Если хочешь, чтобы была одна цифра (после точки) - %.1f, две - %.2f, три - %.3f
Reply
#3

Проблема НЕ в количестве чисел после точки, а в самом выводе.
Если попытаться вывести 40.1 как
pawn Код:
printf("%.1f",40.1);
То выведет НЕ 40.1, а 40.0 !

Хотя 10.1, 20.1, 30.1 выводит нормально.
Reply
#4

А что удивительного?
Почитайты про основы програмирования и о том как процессоры оперируют числами.
Reply
#5

Если бы для меня здесь не было бы ничего удивительного, я бы, очевидно, не создавал бы данную тему и не задавал бы подобный вопрос. Если на то пошло, то, будьте так добры, выражайтесь конкретнее, если у Вас имеются какие-либо стоящие сведения или предположения по данному вопросу.
Reply
#6

Процессоры не умеют работать с числами с плавающей запятой, они могут оперирывать только целыми числами, для работы с дробными на уровне ядра идет их "интерпретация".
Погрешность которая вас удивила последствия этой "интерпретации", и от неё не избавиться.
Reply
#7

Весьма благодарен за столь содержательный ответ. Тема более не актуальна.
Reply
#8

Как округлить число Alpha до 0.1 тут new Float:Raznica=(Alpha-Beta);
Есть ли StrFloat или как это обойти
Reply
#9

Quote:
Originally Posted by White_116
Посмотреть сообщение
Как округлить число Alpha до 0.1 тут new Float:Raznica=(Alpha-Beta);
Есть ли StrFloat или как это обойти
floatround?
Reply
#10

а если до 0.01
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)