Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Introduction

Boost , Math Toolkit 2.5.0 , Facets for Floating-Point Infinities and NaNs

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext
The Problem

Стандарт C++98 не определяет, какбесконечностьиНан.представлены в текстовых потоках. В результате разные платформы используют разные представления строк. Это может привести к неопределенному поведению при перемещении текстовых файлов между различными платформами. Некоторые платформы не могут даже вводить анализ собственного выхода. Таким образом, «маршрутизация» или обратный цикл вывода на вход невозможен. Например, следующий тест не справляется с MSVC:

stringstream ss;
double inf = numeric_limits<double>::infinity();
double r;
ss << inf; // Write out.
ss >> r; // Read back in.
cout << "infinity output was " << inf << endl; // 1.#INF
cout << "infinity input was " << r << endl; // 1
assert(inf == y); // Fails!
The Solution

Формы<nonfinite_num_put>и<nonfinite_num_get>форматируют и разбирают все числа с плавающей запятой, включая<infinity>и<NaN>, последовательно и переносимо.

Следующий тест успешно с MSVC.

locale old_locale;
locale tmp_locale(old_locale, new nonfinite_num_put<char>);
locale new_locale(tmp_locale, new nonfinite_num_get<char>);
[Tip] Tip

Чтобы добавить два аспекта,<nonfinite_num_put>и<nonfinite_num_get>, вам, возможно, придется добавить один за раз, используя временную локацию.

Вы можете создать новый сайт за один шаг.

<std::localenew_locale(std::locale(std::locale(std::locale(),newboost::math::nonfinite_num_put<char>),newboost::math::nonfinite_num_get<char>));>

и, например, использовать его для встраивания входного и выходного потоков.

[Tip] Tip

Чтобы просто изменить входной или выходной поток, вы можете кратко написать<cout.imbue(std::locale(std::locale(),newboost::math::nonfinite_num_put<char>));>или<cin.imbue(std::locale(std::locale(),newboost::math::nonfinite_num_get<char>));>.

stringstream ss;
ss.imbue(new_locale);
double inf = numeric_limits<double>::infinity();
ss << inf; // Write out.
assert(ss.str() == "inf");
double r;
ss >> r; // Read back in.
assert(inf == r); // Confirms that the double values really are identical.
cout << "infinity output was " << ss.str() << endl;
cout << "infinity input was " << r << endl;
// But the string representation of r displayed will be the native type
// because, when it was constructed, cout had NOT been imbued
// with the new locale containing the nonfinite_numput facet.
// So the cout output will be "1.#INF on MS platforms
// and may be "inf" or other string representation on other platforms.
C++0X standard for output of infinity and NaN

C++0X (окончательный) проект стандартаявно не указывает представление (и ввод) неконечных значений, оставляя его реализация-определенным. Таким образом, без определенного действия вход и выход неконечных значений не переносимы.

C99 standard for output of infinity and NaN

В стандартеC99указывается, как бесконечность и NaN форматируются с помощью функции printf и аналогичных выходных функций и анализируются с помощью функции scanf и аналогичных функций ввода.

Используются следующие струнные представления:

Table 2.1. C99 Representation of Infinity and NaN

номер

струна

Положительная бесконечность

«инф» или «бесконечность»

Положительная нан

"нан" или "нан(...)"

Отрицательная бесконечность

«-inf» или «-infinity»

Негативный NaN

"-nan" или "-nan(...)"


Таким образом, следование C99 обеспечивает разумный «стандартный» способ обработки ввода и вывода нефинитов в C++, и эта реализация следует большинству этих форматов.

Signaling NaNs

Особым типом NaN является сигнальный NaN. Обычный механизм сигнализации заключается в повышении исключения из плавающей точки. Сигнальные NaN определяются поIEEE 754-2008.

Значения плавающей точки с компоновкойs111 1111 1axx xxxx xxxx xxxx xxxx xxxx xxxx, гдеsявляется знаком,xявляется полезной нагрузкой, а битaопределяет тип NaN.

Еслиa= 1, то это тихий NaN.

Если битaравен нулю, а полезная нагрузкаxне равна нулю, то это сигнальный NaN.

Хотя существует теоретический интерес к способности сигнализации NaN вызывать исключение, например, для предотвращения использования неинициализированной переменной, на практике, по-видимому, нет полезного применения сигнализации NaN для большинства современных процессоров.C++0X 18.3.2.2по-прежнему определяет (определяемое реализацией) представление для сигнализации NaN и<staticconstexprboolhas_signaling_NaN>способ проверки, имеет ли тип с плавающей точкой представление для сигнализации NaN.

Но на практике большинство платформ относятся к сигнальным NaN так же, как к тихим NaN. Так, например, они представлены «наном» на выходе в форматеC99и выходом как<1.#QNAN>компиляторами Microsoft.

[Note] Note

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

Спецификация C99 не определяет поведение сигнальных NaN. NaN, созданные IEC 60559, всегда тихие. Поэтому эта реализация следует за C99 и рассматривает сигнальный бит NaN как часть поля полезной нагрузки NaN. Таким образом, эта реализация не различает два класса NaN.

[Note] Note

Реализация может дать знаку нулевые и нецифровые значения (такие как бесконечности и NaNs) или может оставить их неподписанными. Везде, где такие значения не подписаны, любое требование стандарта C99 о извлечении знака должно содержать неуказанный знак, и любое требование о его установке должно быть проигнорировано.

Это может относиться к определенным пользователям типам, но на практике встроенные типы с плавающей запятой<float>,<double>и<long double>имеют хорошо управляемые знаки.

Эти числа могут быть типа<float>,<double>и<long double>. Дополнительный знак + может использоваться с положительными числами (контролируется манипулятором ios<showpos>). Функция<printf>и аналогичные функции C++ используют стандартные флаги форматирования для размещения всех нижних или всех верхних регистров (контролируемых манипулятором<std::ios><uppercase>и<lowercase>).

Функция<scanf>и аналогичные функции ввода нечувствительны к случаю.

В 93-й строке фигурирует произвольная строка. Смысл этой строки зависит от реализации. Его можно использовать для передачи дополнительной информации о NaN из «полезной нагрузки». Например, конкретное значение полезной нагрузки может использоваться для указанияотсутствующего значения.

Эта библиотека использует представления строк, указанные стандартом C99.

Пример реализации, которая необязательно включает в себя информацию о полезной нагрузке NaN, находится по адресуAIX NaN fprintf. Эта реализация определяет для Binary Floating Point NANs:

  • Порядковая последовательность NaN представляет собой символ «(», за которым следует цифровая последовательность, представляющая целое число n, где 1<= n<= INT_MAX-1, за которым следует символ «) правого парентеза».
  • Целое значение, n, определяется дробными битами значения аргумента NaN следующим образом:
  • Для сигнального значения NaN дробь NaN поворачивается (слева направо) для получения битов (справа налево) четного целого значения 2*n. Затем отформатированные выходные функции производят (сигнальную) последовательность NaN, соответствующую целому значению n.
  • Для тихого значения NaN дробь NaN поворачивается (слева направо) для получения битов (справа налево) нечетного целого значения 2*n-1. Затем отформатированные выходные функции производят (тихую) последовательность NaN, соответствующую целому значению n.
[Warning] Warning

Эта реализация (пока) не обеспечивает вывод или доступ к полезной нагрузке NaN.


PrevUpHomeNext

Статья Introduction раздела Math Toolkit 2.5.0 Facets for Floating-Point Infinities and NaNs может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Facets for Floating-Point Infinities and NaNs ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 01:59:07/0.0079829692840576/1