Двойной, чтобы поплавать нановой конверсииC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Двойной, чтобы поплавать нановой конверсии

Сообщение Anonymous »

Я разработал небольшую программу, которая преобразует случайные двойные NANS в поплавки и печатает шестигранные значения обоих: < /p>
#include
#include
#include
#include
#include

using namespace std;

int main()
{
mt19937_64 mt;
uniform_int_distribution uid( 0x7FF0000000000001u, 0x7FFFFFFFFFFFFFFFu );
for( size_t r = 100; r; --r )
{
uint64_t b64 = uid( mt ) | mt() & numeric_limits::min();
double f64 = bit_cast( b64 );
feclearexcept( FE_ALL_EXCEPT );
float f32 = (float)f64;
bool invalid = fetestexcept( FE_INVALID );
uint32_t b32 = bit_cast( f32 );
auto print = []( UInt ui )
requires (sizeof(UInt) == 4 || sizeof(UInt) == 8)
{
constexpr bool _64 = sizeof(UInt) == 8;
bool sign = (make_signed_t)ui < 0;
bool quiet = ui >> (_64 ? 51 : 22) & 1;
UInt mant = ui & (_64 ? 0x7FFFFFFFFFFFFu : 0x3FFFFFu);
cout +:Q:2a6aae:*
+:Q:4fda297096d44 -> +:Q:27ed14:*
+:Q:6f253867322ed -> +:Q:37929c:*
-:Q:5a5501f76531e -> -:Q:2d2a80:*
-:S:5ea264d24cafb -> -:Q:2f5132:E
-:Q:16fd21923d828 -> -:Q:0b7e90:*
+:S:0175f4ea08c6e -> +:Q:00bafa:E
+:S:4c103d0c50172 -> +:Q:26081e:E
-:Q:39d88e9704345 -> -:Q:1cec47:*
-:Q:66e0124e32eda -> -:Q:337009:*
+:S:20f9dbcc42dee -> +:Q:107ced:E
-:S:20dcfe42bcb15 -> -:Q:106e7f:E
+:Q:4e488f3a3480b -> +:Q:272447:*

...
< /code>
Каковы правила, как мантисса двойного NAN преобразуется в Float Nan? Как и в любых расчетах с сигнализацией NAN, результатом является тихое NAN, а исключение FE_INVALID установлено. Но как определяются дальнейшие биты?>

Подробнее здесь: https://stackoverflow.com/questions/794 ... conversion
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»