2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3, 4, 5  След.
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:26 
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Потому что порядок минимальный и мантисса минимальная из возможных ненулевых.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:42 
Dmitriy40 в сообщении #1317951 писал(а):
мантисса минимальная из возможных ненулевых.
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Dmitriy40 в сообщении #1317951 писал(а):
порядок минимальный
Я уже посчитал, что порядок минимальный — это как максимальный (число 1023), только брать надо с противоположным знаком. В чем ошибка? Под знак отводится отдельный бит. Ошибки быть не должно.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:44 
Qlin в сообщении #1317957 писал(а):
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Во-первых, какая разница, как принято где-то там, для формата машинного представления чисел. Во-вторых посмотрите же IEEE 754.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:47 
Ушёл читать всё, что мне рекомендовано.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:48 
Qlin в сообщении #1317957 писал(а):
Так значит целая часть мантиссы всё же хранится и в ней может быть ноль? Странно, потому что в науке вроде принято оставлять одну значащую цифру.
Посмотрите наконец формат представления денормализованных чисел. Чего гадать-то?!

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:48 
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Наименьшее положительное - это $+0$. Есть ещё и $-0$. :mrgreen:

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 18:56 
Нули не считаются положительными/отрицательными и даже равны друг другу. Чтобы узнать знак нуля, надо исхитриться.

-- Чт июн 07, 2018 21:00:20 --

Ещё полезное чтение: (Google) what every computer scientist should know about floating-point arithmetic, тут можно открыть страницу от Oracle, а лучше, наверное, скачать PDF; это глава из какой-то книги, получившая распространение сама по себе.

UPD. Вот ещё полезный сайтик: http://floating-point-gui.de/.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:04 
Аватара пользователя
arseniiv в сообщении #1317950 писал(а):
Или там ещё какие-то случаи есть?

Afaik, нет.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:10 
realeugene в сообщении #1317962 писал(а):
Qlin в сообщении #1317941 писал(а):
А почему наименьшее положительное — это $2^{-52} \times 2^{-1022}$?
Наименьшее положительное - это $+0$. Есть ещё и $-0$. :mrgreen:

код: [ скачать ] [ спрятать ]
Используется синтаксис C
#include <iostream>
int main()
{
    double x1 = +0.0;
    double x2 = -0.0;
    if ( x1 > 0 )
        std::cout << x1 << " is positive" << std::endl;
    else
        std::cout << x1 << " is not positive" << std::endl;
    if ( x1 < 0 )
        std::cout << x1 << " is negative" << std::endl;
    else
        std::cout << x1 << " is not negative" << std::endl;
    if ( x1 == 0 )
        std::cout << x1 << " is zero" << std::endl;
    else
        std::cout << x1 << " is not zero" << std::endl;
    if ( x2 > 0 )
        std::cout << x2 << " is positive" << std::endl;
    else
        std::cout << x2 << " is not positive" << std::endl;
    if ( x2 < 0 )
        std::cout << x2 << " is negative" << std::endl;
    else
        std::cout << x2 << " is not negative" << std::endl;
    if ( x2 == 0 )
        std::cout << x2 << " is zero" << std::endl;
    else
        std::cout << x2 << " is not zero" << std::endl;
}
 

0 is not positive
0 is not negative
0 is zero
-0 is not positive
-0 is not negative
-0 is zero

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:12 
realeugene в сообщении #1317962 писал(а):
Наименьшее положительное - это $+0$.
Это неправда, для него не выполняется требование положительности: $+0 \not > 0$. Как и для $-0$ требование отрицательности.
Более того, $+0=0=-0$. Ни один из $\pm0$ ни меньше нуля, ни больше. Только что проверил:
Используется синтаксис Delphi
{$APPTYPE CONSOLE}
var     a, b: double;
begin
        a := -0.0; b := +0.0;
        Writeln(a); Writeln(b);
        Writeln(a < b, ',', a = b, ',', a > b);
        Writeln(a < 0, ',', a = 0, ',', a > 0);
        Writeln(b < 0, ',', b = 0, ',', b > 0);
end.
Используется синтаксис Text
-0.00000000000000E+0000
 0.00000000000000E+0000
FALSE,TRUE,FALSE
FALSE,TRUE,FALSE
FALSE,TRUE,FALSE

UPD. О, а вот и для С проверку выложили.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:13 
Munin
Ну вот, напугали. Думаю, про 80-битный расширенный формат в этой теме говорить не обязательно, он ещё ведь и не во всех процессорах наверняка доступен для манипуляций (когда доступны binary32 и binary64).

-- Чт июн 07, 2018 21:15:19 --

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

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:15 
Munin в сообщении #1317970 писал(а):
Afaik, нет.
80-битный long double разве не стандартизован как расширенный плавающий тип?

arseniiv в сообщении #1317966 писал(а):
Нули не считаются положительными/отрицательными и даже равны друг другу. Чтобы узнать знак нуля, надо исхитриться.
Равны, но python знак печатает. Как и C и Pascal.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:21 
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?
Нет, от него всё же отказались в пользу 16-ти и 32-х байтовых форматов. Если речь про стандарт IEEE 754 ("The standard does not require an implementation to support extended or extendable precision formats.").

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:22 
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?
Как the расширенный нет. Как один из возможных расширенных binary64 да, и это наименьший возможный: https://en.wikipedia.org/wiki/IEEE_754#Extended_and_extendable_precision_formats. Реализация не обязана поддерживать расширенные форматы (см. всё там же).

realeugene в сообщении #1317978 писал(а):
Равны, но python знак печатает.
Не читал сам стандарт, но кажется он и не должен запрещать им иметь разные строковые представления. Тут надо ещё напомнить, что он определяет не одно отношение порядка (это точно знаю) и, кажется, не одно отношение равенства, хотя высокоуровневые языки обычно не дают доступа ко всей этой красоте.

 
 
 
 Re: Тип double в C++
Сообщение07.06.2018, 19:26 
Аватара пользователя
realeugene в сообщении #1317978 писал(а):
80-битный long double разве не стандартизован как расширенный плавающий тип?

Ни в коем случае. Он допустим, как расширенный плавающий тип, но не стандартизован. (На расширенные только наложены некоторые требования, которым 80-битный удовлетворяет.)

Более того, 80-битные поддерживаются только архитектурами Intel (я бы даже сказал, только x86, но не уверен насчёт IA-64). Остальные производители предпочитают 128-битный long double, как раз стандартизованный IEEE 754. Более того, IEEE 754-2008 (ныне действующий) стандартизует также и 256-битный формат.

 
 
 [ Сообщений: 68 ]  На страницу Пред.  1, 2, 3, 4, 5  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group