Swift Infinity в типе данных Int

Я вижу, в отличие от Double, Int в Swift не имеет бесконечности. Единственное, что у нас есть, это Int.max и Int.min, которые на самом деле являются числами, и (Int.max - 1) не совпадает с Int.max. Мне нужно выполнить такие операции, как:

//maximumDuration is Integer...width, widthPerSecond, currentWidth are CGFloat, all positive

width = max(CGFloat(maximumDuration) * widthPerSecond, currentWidth)

Таким образом, если maxDuration равно Int.max, CGFloat(maximumDuration) * widthPerSecond может не быть Int.max. Фактически, сравнения могут быть ненадежными из-за переполнения.

Как получить истинную бесконечность при использовании типа данных Int? Одним из способов было бы использовать Double вместо Int, но это потребовало бы слишком много приведения типов повсюду в коде.

Я не понимаю, что вы здесь хотите, у Int есть четко определенные максимальные и минимальные значения, так как вы должны выходить за эти значения?

Joakim Danielson 14.12.2020 19:42

Это законный вопрос. Типы с плавающей запятой имеют специальные способы представления значений вне диапазона, таких как бесконечность. Двоичные целочисленные типы этого не делают.

Duncan C 14.12.2020 20:05

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

Sulthan 14.12.2020 20:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
694
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все целочисленные типы являются простыми скалярами. Все биты содержат значение (плюс бит знака для вариантов со знаком). Нет запасных битов для маркировки таких вещей, как NAN, (не число) бесконечность, нормализованная/ненормализованная.

Просто невозможно представить бесконечность с помощью двоичных целочисленных типов. Это не уникально для Swift. Это верно практически для всех разных языков/платформ.

Типы с плавающей запятой используют формат IEEE, в котором некоторые биты резервируются для особых случаев, таких как бесконечность.

Вы можете создать перечисление со связанными значениями, которые имеют случаи для отрицательной и положительной бесконечности, NAN и т.п., но у вас будут те же проблемы приведения/переделки кода, которых вы пытаетесь избежать с числами с плавающей запятой.

Редактировать:

Интересно, что в двоично-десятичном коде (BCD) есть запасные биты. Интересно, существует ли стандарт для указания специальных значений, таких как бесконечность, в BCD?

Другие вопросы по теме