2016-10-22 3 views
2

Как C++ round, если целые числа с подписью/без знака неявно преобразуются в floats/doubles?Как C++ round int для float/double?

Как:

int myInt = SomeNumberWeCantExpressWithAFloat; 
float myFloat = myInt; 

Мой университет сценарий говорит следующее: Полученное значение является представляемое значение ближайшего к исходному значению, когда связи разрываются в определенном реализацией моды.

Пожалуйста, объясните, как «ближайшая представима значения» рассчитываются и что «где связи разрывается в определенной реализации моды» должен означать.

Редактировать:
Поскольку я большую часть своего рабочего времени работаю с GCC, просьба дать дополнительную информацию о том, какое представление с плавающей запятой используется GCC по умолчанию, если таковое имеется.

+0

Я не спрашивал, как конвертировать float/double в int, а также как объединить всплывающие окна. Пожалуйста, перечитайте мой вопрос! –

+0

someNumber должен быть целым числом, я отредактирую это –

+0

Это не правильный дубликат. ОП не спрашивает, как добиться округления. Вместо этого он просит объяснения '(int) f', когда' f' является 'float'. – dasblinkenlight

ответ

1

IEEE 754 определяет 5 различных режимов округления о том, как округлять числа:

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


из GCC Wiki:

без каких-либо явных опций GCC предполагает, округляется до ближайшего или даже и не заботится о сигнализации пренебрежимо малых. Сравните с C99's #pragma STDC FENV ACCESS OFF. Также см. Примечание на x86 и m68080.


округляется до ближайшего, галстуки даже

Материала из Википедии:

Завершает число г до ближайшего целого требует ничьих правила для тех, случаи, когда y точно на полпути между двумя целыми числами - , т. е. когда доля части y равна 0,5 ,

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


Источники:


Вы можете редактировать. Оценена дополнительная информация о правилах конверсии для рациональных/иррациональных чисел.

1

Номера с плавающей точкой с одинарной точностью имеют 24-битную мантиссу. В системах с 32-битными int значения представления выше 2 и ниже - (2) требуют округления.

Значение 2 +1 = 16777217 - это первый int, который не может быть представлен точно в формате IEEE binary32. Доступны два изображения float - 16777216, что ниже точного значения на 1 и 16777218, что выше точного значения, также на 1. Следовательно, у нас есть связь, означающая, что C++ разрешено выбирать один из этих двух представления.

+0

Это только наполовину правда, так как есть много номеров> 2 мы можем представлять, возможно, взглянуть на мой ответ, я новичок в SO, но я старался изо всех сил. –

+0

@Aresloom Поскольку ваш вопрос касается чисел, которые мы не можем представлять, числа, которые мы можем представить, не имеют отношения к этой дискуссии (стандарт говорит, что они должны быть преобразованы точно). Все режимы округления, которые вы описываете, есть. В стандарте говорится только о том, что если есть представление, которое ближе, чем другое, то оно должно победить; в противном случае, до реализации, какой из многих режимов использовать для преобразования, то есть ваша программа не должна зависеть от конкретной. – dasblinkenlight

Смежные вопросы