Что происходит в C++, когда целый тип брошен к типу с плавающей точкой или наоборот?

Базовые биты просто становятся "данными иное толкование" как значение с плавающей точкой? Или есть ли преобразование во время выполнения для создания ближайшего значения с плавающей точкой?

Действительно ли порядок байтов является фактором на каких-либо платформах (т.е. порядок байтов плаваний отличается от ints)?

Как различные типы ширины ведут себя (например, интервал для плавания по сравнению с интервалом для удвоения)?

Что стандарт языка гарантирует о безопасности таких бросков/преобразований? Броском я имею в виду бросок C-стиля или static_cast.

Что относительно обратного плавания к международному преобразованию (или вдвое больший по сравнению с интервалом)? Если плавание содержит маленькое значение величины (например, 2), комбинация двоичных разрядов имеет то же значение при интерпретации как интервал?

17
задан Gregory Pakosz 12 January 2010 в 14:41
поделиться

7 ответов

Получают ли биты, лежащие в основе, просто "переинтерпретируются" в качестве значения с плавающей точкой?

Нет, значение конвертируется в соответствии с правилами стандарта.

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

Да, есть преобразование во время выполнения.

Для числа с плавающей точкой -> целое значение усекается при условии, что исходное значение находится в диапазоне целочисленного типа. Если нет, то поведение не определено. По крайней мере, я думаю, что имеет значение не результат, а исходное значение. Чтобы быть уверенным, я бы посмотрел на него. Граничным случаем, если целевым типом является, скажем, char, будет CHAR_MAX + 0.5. Я думаю, что это не определено, чтобы привести это к знаку char, но, как я уже сказал, я не уверен.

Для целого числа -> с плавающей точкой результат, если возможно, будет одно и то же значение, или же одно из двух значений с плавающей точкой по обе стороны от целочисленного значения. Не обязательно, что ближе к двум.

Является ли эндианность фактором на любых платформах (т.е. эндианность с плавающей точкой отличается от эндианности с точками с запятой)?

Нет, никогда. Преобразования определяются в терминах значений, а не в представлениях хранилища.

Как ведут себя различные типы ширины (например, int to float vs. int to double)?

Все, что имеет значение - это диапазоны и точности типов. Если предположить, что 32 битные дюймы и IEEE 32 битные плавающие, то преобразование int->float может быть неточным. Если также предположить, что 64-битное IEEE удваивается, то невозможно сделать неточным int->double преобразование, т.к. все значения int могут быть точно представлены как double.

Что гарантирует стандарт языка о безопасности таких каст/конверсий? Под кастом я понимаю статический_каст или C-стиль.

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

Если плавающая запятая имеет значение малой величины (например, 2), имеет ли образец бита то же значение при интерпретации, что и int?

Нет, не имеет. В IEEE 32-битное представление 2 равно 0x40000000.

11
ответ дан 30 November 2019 в 13:05
поделиться

Если вы бросили саму по себе значение, он будет преобразован (так в поплавке -> Int Conversion 3.14 становится 3).

Но если вы бросаете указатель, то вы на самом деле вы будете «переосмысливать» базовые биты. Поэтому, если вы сделаете что-то подобное:

double d = 3.14;
int x = *reinterpret_cast<int *>(&d);

X будет иметь «случайное» значение, которое основано на представлении плавающей точке.

0
ответ дан 30 November 2019 в 13:05
поделиться

Q1) Если известно максимальное количество столбцов, можно заполнить пустые записи NaN Кроме того, если все значения числовые, вам действительно нужен столбец «Item #»? Если да, можно использовать только «#», поэтому все данные числовые.

Q2) Самый быстрый способ чтения числовых данных из файла без mex-файлов - csvread. Я стараюсь избегать использования последовательностей в csv-файлах, но если мне нужно, я использую мою функцию csv2cell:

http://www.mathworks.com/matlabcentral/fileexchange/20135-csv2cell

-121--3894551-

Несколько мыслей о вещах, которые вам не нравятся в SubSonic:

  • использует IQueryable < > и множественные имена для обоих концов отношения один ко многим - что

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

  • создает один файл для всех классов - как тысяча строк на класс, у меня плохое предчувствие относительно того, что файлы кода настолько велики;

Вы думаете, что это может вызвать проблемы, но я еще не наткнулся на какие-либо, и я еще не видел один отчет о стеке переполнения.

  • Обработка T4 вызывается автоматически, поэтому база данных с актуальной схемой должна быть доступна постоянно.

Она вызывается автоматически, только если вы редактируете файлы t4, поэтому вам действительно нужна обновленная схема, доступная только при внесении изменений в шаблоны.

-121--3995818-

Переинтерпретировано? Термин «переосмысление» обычно относится к переосмыслению необработанной памяти. Конечно, невозможно осмысленно переосмыслить целое значение как значение с плавающей запятой (и наоборот), поскольку их физические представления, как правило, совершенно разные.

При приведении типов выполняется преобразование времени выполнения (в отличие от переинтерпретации ). Преобразование обычно является не просто концептуальным, оно требует фактических затрат времени выполнения из-за разницы в физическом представлении. Между битовыми узорами исходных и целевых значений нет языковых отношений. Эндианесса тоже не играет в ней никакой роли.

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

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

Следует также отметить, что преобразования с плавающей запятой в целое (и обратное) являются стандартными преобразованиями и формально не требуют явного приведения. Иногда люди могут использовать явный приведение для подавления предупреждений компилятора.

2
ответ дан 30 November 2019 в 13:05
поделиться

IDE - Это может быть сложно, но я прошел через несколько различных прогрессий в течение многих лет. Иногда, находясь в проекте или определенной функции, можно инициировать модернизацию. Например, кто-то внедрил функцию, используя LINQ, так что проект ASP.Net 2.0 стал проектом 3.5 в одночасье. В других случаях это как раз то, что используется в настоящее время. Здесь точка, что изменение может повлиять на всю команду, так что это не изменение, чтобы быть сделано легкомысленно.

Инструменты отслеживания ошибок - Это также в той стране централизованной информации, которая должна тщательно управляться. Поскольку это инструмент обеспечения качества, я надеюсь, что у них есть своя политика, как часто искать обновления и когда устанавливать их, так как иногда новые функции могут быть круты, чтобы получить. Эквивалентом команды разработчиков будет время обновления вики-сайта.

Контроль версий - Они индивидуально управляются, так как большинство из нас используют Tortoise SVN, так что у каждого из нас есть локальная копия клиента. Я люблю быть в курсе, насколько это возможно, лично.

OS - Хотя часть этого может контролироваться на уровне отдела, есть достаточно различных частей, чтобы обновить, что иногда я буду запускать обновление самостоятельно. Я не уверен, когда мы перейдем на Windows 7, так как я знаю, что мы не идем на Vista, и я бы подумал, что в какой-то момент мы выйдем из XP, как я был на XP сейчас около 5 лет, как до этого я был на Windows 2000 Professional в течение нескольких лет и NT 4.0 до этого.

ПК - Есть политика, что каждые 3 года мы получаем новые машины, я считаю. Когда я начинал там, где сейчас нахожусь, я был на P4 коробке, поэтому модернизация до двухъядерной коробки была очень хорошим, а также хорошим увеличением оперативной памяти с 2 ГБ до 4 ГБ.

-121--4669722-

Не протестирован, но...
При передаче URL-адреса справки (например, ms-help ://embarcadero.rs2009/delphivclwin32/System __ TDateTime __ - @ TDateTime _ @ const.html ) встроенному WebBrowser он должен работать.

-121--4013157-

Для справки, это то, что ISO-IEC 14882-2003 говорит

4,9 Плавающие-интегральные преобразования

rvalue плавающего типа точки может быть преобразовано в rvalue целочисленного типа. Преобразование усекается; то есть дробная часть отбрасывается. Поведение не определено, если усеченное значение не может быть представлено в целевом типе. [Примечание: Если типом назначения является 'bool, см. 4.12.]

Значение rvalue целочисленного типа или типа перечисления может быть преобразовано в значение rvalue плавающего типа точки. По возможности результат является точным. В противном случае это определяемый реализацией выбор следующего более низкого или более высокого представимого значения. [Примечание: потеря точности происходит, если интегральное значение не может быть представлено точно как значение плавающего типа.] Если исходным типом является bool , значение false преобразуется в ноль, а значение true - в единицу.

Справка: О чем должен знать каждый компьютерный ученыйТочечная арифметика

Другие очень ценные ссылки на тему быстрого плавающего в int преобразования:

Хорошо прочитайте

7
ответ дан 30 November 2019 в 13:05
поделиться

Опрос - это простое решение; Комета является более эффективным решением. У тебя прибит :)

Я лично люблю комету (хотя я предвзятый, так как я помог написать Webync ), он хорошо позволяет своим клиентам подписаться на канал и получить сообщение, когда ваш Серверный процесс готов. Работает как чемпион.

-121--3747634-

Преобразование FP на интегральный тип нетривиален и даже не полностью определен.

Обычно ваш FPU реализует инструкцию оборудования для преобразования от формата IEEE на INT . Эта инструкция может принимать параметры (реализованные в оборудовании) контролирующих округление. Ваш ABI, вероятно, указывает раунд до ближайшей. Если вы на X86 + SSE, это «вероятно, не слишком медленно», но я не могу найти ссылку с одним поиском Google.

Как и с чем-либо FP, есть угловые случаи. Было бы здорово, если бы бесконечность была сопоставлена ​​на (тип) _max , но это не так, как правило, не так, а результат int x = бесконечности; не определено.

0
ответ дан 30 November 2019 в 13:05
поделиться

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

Когда вы преобразуете поплавок на int, вы по сути, выполняете работу пола (). Таким образом, он просто бросает биты после десятичной работы

для получения дополнительной информации о снимке с плавающей точкой: http://www.lahey.com/float.htm

Одноточный формат IEEE имеет 24 бита Mantissa , 8 бит экспоненты и знаки. Внутренние регистры с плавающей точкой в ​​микропроцессорах Intel, такие как Pentium, имеют 64 бита Mantissa, 15 битов экспонанта и знака. Это позволяет проводить промежуточные расчеты с гораздо меньшей потерей точности, чем многие другие реализации. Внутренняя сторона этого состоит в том, что, в зависимости от того, как промежуточные значения содержатся в регистрах, расчеты, которые выглядят тому же, могут дать разные результаты.

Итак, если ваше целое число использует более 24 бит (исключая скрытый ведущий бит), то вы, вероятно, потеряете определенную точность в преобразовании.

2
ответ дан 30 November 2019 в 13:05
поделиться

Обычно существуют преобразования во время выполнения, поскольку битовые представления обычно несовместимы (за исключением того, что двоичный 0 обычно равен 0 и 0,0). Стандарты C и C ++ имеют дело только со значением, а не с представлением, и определяют в целом разумное поведение. Помните, что большое значение int обычно не может быть точно представлено в float , а большое значение float не может быть представлено int ].

Следовательно:

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

Не беспокойтесь о порядке байтов, поскольку это вопрос побитового представления.

Преобразование int в float может привести к потере точности, если целочисленное значение велико по модулю; это менее вероятно с double , поскольку double является более точным и может представлять гораздо более точные числа. (Детали зависят от того, какие представления система фактически использует.)

В определениях языка ничего не говорится о битовых шаблонах.

Преобразование из float в int также зависит от значений, а не от битовых шаблонов. Точная версия 2.0 с плавающей запятой преобразуется в целое 2, потому что так устроена реализация, а не из-за битовых шаблонов.

4
ответ дан 30 November 2019 в 13:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: