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

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

1 minute ago, ViKo said:

Правильно. Только разрядов лишних есть 53 - 32 = 21. То есть, добавить к своему числу 1 - 2^-21.

ой, как я описался :) действительно 20 бит.

 

Вот только я-то писал умножить на число 1-2^33, или 1-DBL_EPSILON*2^20. Добавлять нельзя. В крайнем случае можете добавить 0.5, если не хочется умножать, а надо добавлять. Для 32 бит и двойной точности - это тоже вариант.

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


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

31 минуту назад, jcxz сказал:

#define CEIL(x) (((double)(u64)(x) >= (x)) ? (u64)(x): (u64)(x) + 1)

О, спасибо! Только на >= проверять не надо, поскольку обрезанное число больше быть не может.

 

Не канает. Вызываются float функции.

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


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

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

О, спасибо! Только на >= проверять не надо, поскольку обрезанное число больше быть не может.

Для чисел с плавающей точкой лучше стараться избегать проверок на ==. Потому как не известно в какую сторону идёт округление во всех промежуточных операциях.

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


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

по моему, так как мантисса в дабле 10**308, а десятичных цифр 17, то где-то 10**290

писать ответ начал до того как 100500 ответов, а дописал только сейчас, извиняйте, если что

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


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

По моим экспериментам, для округления до не меньшего 32-битового целого достаточно добавить 1 - 2^-20 или 1 - 2^-21. Спасает именно то, что результирующее число должно укладываться в 32 бита. 

#define CEIL(x)        ((uint32_t)((x) - 2E-20 + 1))

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


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

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

По моим экспериментам, для округления до не меньшего 32-битового целого достаточно добавить 1 - 2^-20 или 1 - 2^-21. Спасает именно то, что результирующее число должно укладываться в 32 бита. 

#define CEIL(x)        ((uint32_t)((x) - 2E-20 + 1))

Не очень понятно как это будет работать если исходное число большое. 
Ну напрмер исходное число 10e20 мы пытаемся отнять от него число 2e-20 чтобы отобразить результат нам нужно уже 40 разрядов. А их у нас только 20. Как конкретно  с этим обойдётся процессор нужно вникать отдельно.

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


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

В экспоненте 11 разрядов. Зато в мантиссе 53.

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


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

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

По моим экспериментам, для округления до не меньшего 32-битового целого достаточно добавить 1 - 2^-20 или 1 - 2^-21. Спасает именно то, что результирующее число должно укладываться в 32 бита.

#define CEIL(x)        ((uint32_t)((x) - 2E-20 + 1))

Из этого высказывания и выражения видно, что точка у вас - фиксированная. А значит - числа с плавающей точкой тут вообще не нужны. И всё можно сделать на u32 или u64. Не разводя лес на ровном месте.

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


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

У меня простое желание - описывать время стандартными единицами измерения, секундами. 

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


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

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

У меня простое желание - описывать время стандартными единицами измерения, секундами. 

дык описывайте, простого 32битного числа хватит на 136 лет

=60*60*24*365,25*136

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


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

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

У меня простое желание - описывать время стандартными единицами измерения, секундами. 

Дык описывайте: в старших 32 битах - секунды, в младших 32 - их доли. Итого 64 бита.

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


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

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

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


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

11 minutes ago, ViKo said:

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

Ой, не самое лучшее решение. Задавайте всё в ns (например), и пишите -

5 MS
20 NS

перед этим сделать

#define NS
#define MKS *1000
#define MS *1000000
#define S *1000000000
  

 

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


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

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

Задавайте всё в ns (например), и пишите

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

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


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

2 hours ago, ViKo said:

В экспоненте 11 разрядов. Зато в мантиссе 53.

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

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

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


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

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

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

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

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

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

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

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

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

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