Często potrzebuję do podłogi lub sufitu CGFloat
do int
, do obliczania indeksu tablicy.Jak bezpiecznie podłożyć podłogę lub sufit CGFloat do int?
Problem na stałe z floorf(theCGFloat)
lub ceilf(theCGFloat)
polega na tym, że mogą występować problemy z nieścisłościami zmiennoprzecinkowymi.
Co jeśli mój CGFloat
jest 2.0f
, ale wewnętrznie jest reprezentowany jako 1.999999999999f
lub coś w tym stylu. Robię floorf
i otrzymuję 1.0f
, który znowu jest floatem. A jednak muszę rzucić tę bestię na int, co może wprowadzić inny problem.
Czy istnieje najlepszych praktyk, jak podłoga lub CEIL float
do int
takie, że coś 2.0
nigdy przypadkowo podłogi do 1
i coś podobnego 2.0
nigdy przypadkowo ceiled do 2
?
Na to pytanie nie można odpowiedzieć poprawnie dopóki specyfikacje są opisujący błąd w wartości wejściowej i jakie są konsekwencje zwrotu wartości, które są zbyt wysokie lub zbyt niskie. Występują kompromisy pomiędzy zwracaniem wartości, która jest zbyt wysoka, ponieważ poprzedni błąd zaokrąglenia spowodował, że wartość była zbyt wysoka, a zwracana wartość była zbyt niska, ponieważ wartość została sztucznie dostosowana, aby skompensować poprzedni błąd, i na odwrót. Bez wyjaśnienia kontekstu nie ma jednej prawidłowej odpowiedzi. –