Перейти к содержанию
    

Минимальное double число, изменяющее любое double

1 час назад, ViKo сказал:

Экие вы непонятливые. Мне годы ни к чему. Мне если нужно 5 мс, я и пишу 5e-3, а если нужно 20 нс, то пишу 20e-9. Оттого и данные с плавучими запятыми. 

Плавучие они у вас, потому что не понимаете что такое фикс.точка. И 5мс и 20нс легко фикс.точкой записываются.

55 минут назад, yes сказал:

11 разрядов, то есть влево можно сдвинуть на ~1000 позиций, ну еще хвост из 53, то есть младший бит на уровне 1<<950, на фоне этого 1<<32 глубокий 0

Не 11 в экспоненте double разрядов, а только 10. 53+10+1

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, jcxz said:

Плавучие они у вас, потому что не понимаете что такое фикс.точка. И 5мс и 20нс легко фикс.точкой записываются.

Не 11 в экспоненте double разрядов, а только 10. 53+10+1

вроде бы double это плавающая точка, а фиксированная long long (ну и какие вопросы к фиксированной могут быть - там 1<<32)

53+2**10+1 - тож экспонента, иначе добавили бы просто к мантиссе лишних битов и не геммороились (а в железе float point сложение сделать дофига кремния нужно)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты



8 часов назад, jcxz сказал:

Плавучие они у вас, потому что не понимаете что такое фикс.точка. И 5мс и 20нс легко фикс.точкой записываются.

 Не 11 в экспоненте double разрядов, а только 10. 53+10+1

И каким образом компилятор будет округлять такие числа? 

1 разряд знак, 11 разрядов экспонента, 1 скрытый + 52 разряда мантисса.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, ViKo сказал:

И каким образом компилятор будет округлять такие числа? 

Округляет не компилятор, а программист. Так, как ему надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, ViKo said:

Так у меня давно сделано. Хотел "покрасивее".

Не надо время в floating point хранить и/или обрабатывать, учитесь на чужих ошибках - https://habr.com/ru/company/pvs-studio/blog/312890/

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 часов назад, yes сказал:

11 разрядов, то есть влево можно сдвинуть на ~1000 позиций, ну еще хвост из 53, то есть младший бит на уровне 1<<950, на фоне этого 1<<32 глубокий 0

или я что-то не понимаю?

Это двоичные разряды, не десятичные.

27 минут назад, xvr сказал:

Не надо время в floating point хранить и/или обрабатывать, учитесь на чужих ошибках

 

Убедили! :buba: Я, правда, не храню, а только вычисляю при компиляции. И в double. Но всё равно прекращаю. Потому, что эта добавка для ceil округления любого double до 32-битового целого получается не такая уж малая, - 1e-6 + 1, по последним экспериментам. Т.е., моя задержка может оказаться на 1 мкс меньше, чем надо.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я понимаю, что, что-то не понимаю, но вот

>> s=1e+300

s =

  1.0000e+300

>> m=pow2(2,31)

m =

   4.2950e+09

>> s-m

ans =

  1.0000e+300

>> for i=1:100000 s=s-m; end
>> s

s =

  1.0000e+300

>> class(s)

ans =

    'double'


матлабовский дабл стандартен

Bits

Usage

63

Sign (0 = positive, 1 = negative)

62 to 52

Exponent, biased by 1023

51 to 0

Fraction f of the number 1.f

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы показали, что из почти максимального double сколько ни отнимай 2^32, число не меняется.

У меня был другой вопрос. Мне нужно было для double числа 2^32 найти такое минимальное double, вычитание которого из 2^32 изменит это 2^32.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

43 минуты назад, ViKo сказал:

У меня был другой вопрос. Мне нужно было для double числа 2^32 найти такое минимальное double, вычитание которого из 2^32 изменит это 2^32.  

 

пять минут писанины для грубого расчета
 

    double a = pow( 2, 32 ), b_prev = 0;

    for( double b = 1; ; )
    {
        double c = a - b;

        if( 0 == memcmp( &a, &c, sizeof( c ) ) )
            break;

        b_prev = b;
        b /= 1.1;
    }
    printf( "found %e", b_prev );

found 2.396930e-07

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 минут назад, megajohn сказал:

пять минут писанины

Где запускали на выполнение? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 минуты назад, ViKo сказал:

Где запускали на выполнение? 

MSVC 2015

 

вот тут же такой же результат https://onlinegdb.com/BJA5GHO3N

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Да, всё просто и красиво.

Я здесь потыкался, но не вышло.

http://codepad.org/KiNOFIeB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, ViKo сказал:

Я здесь потыкался, но не вышло.

http://codepad.org/KiNOFIeB

Не прошли тест на профпригодность =)

вот http://codepad.org/F8xqwhic

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы тоже свой исходник поправили. И результаты были разными.

Для

b /= 1.0001;
found 2.385379e-07

b /= 1.00000001

found 2.384186e-07

 

И я уже вернулся к старым добрым целым предсказуемым наносекундам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно меньше :)

2.3841857910156255294e-07

 

41f0000000000000
3e90000000000001
----------
4294967296
2.3841857910156255294e-07
4294967295.9999995232

	long long ed = 0x3e90000000000001ll;
	double* e = (double*)& ed;
	double v = (double)(1ll << 32);
	std::cout.precision(20); //over 9000
	std::cout << std::hex;
	std::cout << *(long long *)&v << "\n";
	std::cout << ed << "\n";
	std::cout << "----------\n";
    std::cout << v << "\n";
	std::cout << *e << "\n";
	std::cout << v-*e << "\n";

 

если что 0x41f-0x3e9=54

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...