Четверг, 28 Ноября 2024, 20:18

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Несколько вопросов по float
alexsilentДата: Понедельник, 06 Января 2020, 05:07 | Сообщение # 1
почти ветеран
Сейчас нет на сайте
1) Какое максимальное число у float? Могу ли я хранить в нём большие числа, например миллиард?
В документации пишут число 3.402823466 E + 38, но я не понимаю, что тут написано,
как понять в обычных числах?

2) Можно ли как-то сделать так, чтобы float имел только два знака после запятой 1000.03 например.
Мне не нравится, что у float может запятая далеко уходить. Есть ли какие-то преднастройки float в C# или придётся
работать с числами типа 1000.03034045? Мне бы хватило сотых долей, абсолютно для любых моих нужд в игре,
ибо мне не нужна сверх точность в тысячных долях.
3) Насколько точно оператор if проверяет float? Может ли оператор ошибиться?
Просто я как-то встречал феномен, когда в юнити я ставлю координаты 0.05, а через некоторое время юнити
мне портит это число превращая его в 0.049999999999, хз с чем это связано, но я боюсь, что однажды
проверка не пройдёт. Например поставлю float = 4, а юнити мне сделает 3.999999999 и if пропустит,
я не знаю как оно работает, но мало ли.

PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f,
Но как сделать подобный трюк, чтобы C# у всех для меня нужных int, считал последние две цифры как сотые доли?


Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 05:45
drcrackДата: Понедельник, 06 Января 2020, 06:33 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата
Какое максимальное число у float?

чем больше число тем ниже точность

Цитата
Могу ли я хранить в нём большие числа, например миллиард?

нет, на миллиарде уже слишком низкая точность, числа будут округляться на плюс минус несколько сотен в разные стороны

Цитата
if пропустит, я не знаю как оно работает, но мало ли.

именно так оно и работает и честно говоря об этом написано в первых главах любого учебника по программированию где вообще упоминаются числа с плавающей запятой

Цитата
PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f,

именно так это и сделано в 99.9999% приложений и игр
alexsilentДата: Понедельник, 06 Января 2020, 06:36 | Сообщение # 3
почти ветеран
Сейчас нет на сайте
Цитата drcrack ()
Цитата
>>PS в идеале я уже думал использовать только int числа, вместо float, например int = 100, это значить 1.00f,

именно так это и сделано в 99.9999% приложений и игр


А как это реализуют? Есть ли английское название у этого феномена, чтоб погуглить?!
Или разработчики просто в уме держат, что 100 = 1.00f, а там где это число надо вывести на экран снижают на два нуля?
Хотелось бы не запутаться, чтоб в уме не держать, но как реализовать, что-то идеи не приходят.


Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 06:39
drcrackДата: Понедельник, 06 Января 2020, 06:38 | Сообщение # 4
старожил
Сейчас нет на сайте
Цитата
А как это реализуют?

делаешь int поле, в нем хранишь копейки (центы, медные монеты, и тд, короче минимальный юнит твоей валюты)
все расчеты ведешь в этих копейках
и только при выводе на экран конвертируешь в рубли+копейки (или золото+серебро+медь, и тд)


Сообщение отредактировал drcrack - Понедельник, 06 Января 2020, 06:38
afqДата: Понедельник, 06 Января 2020, 06:50 | Сообщение # 5
Разработчик
Сейчас нет на сайте
alexsilent, используй тип unsigned long, он же есть такой в твоем языке?
alexsilentДата: Понедельник, 06 Января 2020, 07:01 | Сообщение # 6
почти ветеран
Сейчас нет на сайте
drcrack, а как быть с другими переменными, например Health? Какие там копейки? Просто иногда в игре может нужно отнять 0.02 HP например. Там тоже в уме держать, что 1000 HP, это значить 10.00 HP на самом деле?

Добавлено (06 Января 2020, 07:04)
---------------------------------------------
afq, Спасибо, погуглю, не знаю пока ничего про это. Если там также нестабильно работает проверка "if" как во float, то не очень хорошая перспектива.


Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 07:05
drcrackДата: Понедельник, 06 Января 2020, 07:21 | Сообщение # 7
старожил
Сейчас нет на сайте
Цитата
alexsilent, используй тип unsigned long, он же есть такой в твоем языке?

непохоже что ты вообще понял о чем речь

Цитата
не знаю пока ничего про это.

не утруждай себя, это тот же int только с большим диапазоном значений (хранить сотни миллардов и тд)

Цитата
drcrack, а как быть с другими переменными, например Health? Какие там копейки?

"0.02 HP" вообще не имеет смысла т.к. HP это health (hit) point и он неделим по определению
alexsilentДата: Понедельник, 06 Января 2020, 08:26 | Сообщение # 8
почти ветеран
Сейчас нет на сайте
Цитата drcrack ()
"0.02 HP" вообще не имеет смысла т.к. HP это health (hit) point и он неделим по определению

У меня в ролевой игре, если уровень слишком маленький, то будет отниматься здоровье меньше, чем 1, это главная причина,
почему я хочу оставить float, но боюсь что оно также и не точные параметры имеет.
Не знаю как сделать, чтобы были и сотые доли, и числа точные, и не ниже 0.01.


Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 08:28
drcrackДата: Понедельник, 06 Января 2020, 08:40 | Сообщение # 9
старожил
Сейчас нет на сайте
Цитата
Не знаю как сделать, чтобы были и сотые доли, и числа точные, и не ниже 0.01.

использовать int (long) а не float
при выводе на экран делить на 100


Сообщение отредактировал drcrack - Понедельник, 06 Января 2020, 08:40
alexsilentДата: Понедельник, 06 Января 2020, 08:52 | Сообщение # 10
почти ветеран
Сейчас нет на сайте
drcrack, похоже и правда стоит отказаться от float в большинстве своих переменных. Спасибо)

Сообщение отредактировал alexsilent - Понедельник, 06 Января 2020, 08:53
XakepДата: Понедельник, 06 Января 2020, 10:33 | Сообщение # 11
めちゃくちゃちゃ
Сейчас нет на сайте
в C# есть тип decimal, можешь его использовать, но он будет медленнее и занимет больше памяти. При работе с финансами в реальном мире часто пользуется подобным типом. У decimal не будут подобных казусов с превращением 0.5 в 0.49999.

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/types#the-decimal-type

Цитата alexsilent ()
Или разработчики просто в уме держат, что 100 = 1.00f, а там где это число надо вывести на экран снижают на два нуля?

Чтобы не держать в голове - можно написать функцию хелпер, к примеру, для форматирования числа, что-то вроде: `formatMoney(10050)` которая всегда будет преобразовывать число в строку типа: '100.50'. В будущем еще и может помочь, если ты решишь изменить количество знаков после запятой, надо будет только пару функций подправить и все.

Но вообще, не спеши отказывать от float, просто научись правильно их сравнивать. Не стоит никогда делать сравнения типа (a == b) или (a >= b). Лучше просто сравнивать граничащие значения, к примеру, если здоровье меньше 0.5 то изменить цвет health bar'а. Если же нужно сравнить, что float примерно равен 0.5, то почитай вот это: https://floating-point-gui.de/errors/comparison/ и используй функцию `nearlyEqual`.
alexsilentДата: Понедельник, 06 Января 2020, 11:10 | Сообщение # 12
почти ветеран
Сейчас нет на сайте
Цитата Xakep ()
(a >= b)

Вот это для меня было шоком, ибо в старых кодах я часто использовал для float такую проверку.

Про `nearlyEqual`, спасибо! Погуглю насколько быстрая эта операция.
DivESДата: Понедельник, 06 Января 2020, 11:28 | Сообщение # 13
заслуженный участник
Сейчас нет на сайте
Этому посвящён целый "сайт" :D
drcrackДата: Понедельник, 06 Января 2020, 11:33 | Сообщение # 14
старожил
Сейчас нет на сайте
Цитата
Если же нужно сравнить, что float примерно равен 0.5

... то с вероятностью 99% это косяк архитектуры и float надо заменить на другой тип :D
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг