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

Input Output

Boost , Chapter 1. Boost.Multiprecision , Tutorial

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
Loopback testing

Лупбэкиликруговой походотносится к записи значения в виде десятичной строки с использованием<std::iostream>, обычно к<std::stringstream>, а затем к чтению строки обратно к другому значению и подтверждению того, что эти два значения идентичны. Тривиальный пример с использованием<float>:

float write; // Value to round-trip.
std::stringstream ss;  // Read and write std::stringstream.
ss.precision(std::numeric_limits<T>::max_digits10);  // Ensure all potentially significant bits are output.
ss.flags(std::ios_base::fmtflags(std::ios_base::scientific)); // Use scientific format.
ss << write; // Output to string.
float read;  // Expected.
ss >> read; // Read decimal digits string from stringstream.
BOOST_CHECK_EQUAL(write, read); // Should be the same.

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

T write;
std::stringstream ss;
ss.precision(std::numeric_limits<T>::max_digits10);  // Ensure all potentially significant bits are output.
ss.flags(f); // Changed from default iostream format flags if desired.
ss << write; // Output to stringstream.
T read;
ss >> read; // Get read using operator>> from stringstream.
BOOST_CHECK_EQUAL(read, write);
read = static_cast<T>(ss.str()); // Get read by converting from decimal digits string representation of write.
BOOST_CHECK_EQUAL(read, write);
read = static_cast<T>(write.str(0, f));  // Get read using format specified when written.
BOOST_CHECK_EQUAL(read, write);

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

Comparing with output using Built-in types

Можно провести некоторые сравнения с выходом

<number<cpp_bin_float<53, digit_count_2> >

Он имеет такое же количество существенных битов (53), как и 64-битная плавающая точка с двойной точностью.

Однако, хотя большинство выводов идентичны, на некоторых платформах существуют различия, вызванные поведением, зависящим от реализации, разрешенным спецификацией C99C99 ISO/IEC 9899:TC2, включенной в C++.

"Для конверсий e, E, f, F, g и G, если число значащих десятичных знаков не превышает DECIMAL_ DIG, то результат должен быть правильно округлен. Если число знаковых десятичных знаков больше, чем DECIMAL_ DIG, но исходное значение точно отображается с помощью DECIMAL_ Цифры DIG, то результат должен быть точным представлением с нулями. В противном случае исходное значение ограничено двумя соседними десятичными строками L< U, обе из которых имеют DECIMAL_. DIG значащие цифры; значение результирующей десятичной строки D должно удовлетворять L<= D<= U, с дополнительным условием, что ошибка должна иметь правильный знак для текущего направления округления».

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

[Note] Note

Не ожидайте, что выход с разных платформ будетидентичным, но<cpp_dec_float>,<cpp_bin_float>(и другие бэкэнды) выходы должны быть правильно округлены до числа цифр, запрашиваемых заданной точностью и форматом.

Macro BOOST_MP_MIN_EXPONENT_DIGITS

C99 Стандартдля спецификаторов форматов, 7.19.6 Форматированные функции ввода/вывода требуют:

«Экспонент всегда содержит по крайней мере две цифры и только столько цифр, сколько необходимо для представления экспоненты».

Соответствие стандарту C99 (включен в C++)

#define BOOST_MP_MIN_EXPONENT_DIGITS 2

Microsoft (и MinGW) не соответствуют этому стандарту и предоставляютпо меньшей мере три цифры, например<1e+001>. Поэтому, если вы хотите, чтобы выход соответствовал встроенным типам с плавающей запятой на компиляторах, использующих время выполнения Microsoft, используйте:

#define BOOST_MP_MIN_EXPONENT_DIGITS 3

Также полезно получить минимальную ширину экспонентного поля.

#define BOOST_MP_MIN_EXPONENT_DIGITS 1

Для создания компактного вывода, такого как<2e+4>, важно сохранить пространство.

Более крупные значения также поддерживаются, например, значение 4 для<2e+0004>, которое может быть полезно для обеспечения выравнивания столбцов.


PrevUpHomeNext

Статья Input Output раздела Chapter 1. Boost.Multiprecision Tutorial может быть полезна для разработчиков на c++ и boost.




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



:: Главная :: Tutorial ::


реклама


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

Время компиляции файла: 2024-08-30 11:47:00
2025-05-20 03:45:06/0.0044629573822021/0