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

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

Есть DBL_EPSILON, которое гарантирует, что: 1 - DBL_EPSILON < 1.

Но это для 1. Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D?

Сейчас задаю (DBL_EPSILON * (1ULL << 32)), но не уверен. Надо задать минимальный значащий разряд для максимального double числа, так думаю. Нет ли у него стандартного названия?

Использую для вычисления в макрофункции. Потом я это D привожу к целому - округляю (ceil). Вот и хочу, чтобы

10.00000001 преобразовалось в 11, а не 10; а 10.00000000 в 10. 

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


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

Упражняюсь с этим калькулятором

http://www.binaryconvert.com/result_double.html?hexadecimal=41E0000000200000

Не нахожу решения

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


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

http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/float.h.html

 

Quote

The <float.h> header shall define the following values as constant expressions with implementation-defined (positive) values that are less than or equal to those shown:

  • The difference between 1 and the least value greater than 1 that is representable in the given floating-point type, b1-p.

    FLT_EPSILON
    1E-5
    DBL_EPSILON
    1E-9
    LDBL_EPSILON
    1E-9
  • Minimum normalized positive floating-point number, bemin -1.

    FLT_MIN
    1E-37
    DBL_MIN
    1E-37
    LDBL_MIN
    1E-37

 

Не оно ?

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


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

10 минут назад, dimka76 сказал:

Не оно ?

Не. Компилятор работает по IEEE754 Double precision 64-bit.IEEE754 Double precision 64-bit)IEEE754 Double precision 64-bit)

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


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

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

Но это для 1. Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D?

Не оно?: DBL_MAX/(1ull << DBL_MANT_DIG - 1)

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


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

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

Не оно?: DBL_MAX/(1ull << DBL_MANT_DIG - 1)

Может, и так. Но это число будет более 1. Округлением до целого тут не пахнет.

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


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

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

Может, и так. Но это число будет более 1. Округлением до целого тут не пахнет.

Не понял при чём тут 1 и округление до целого? В исходном вопросе этого не было.

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


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

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

В исходном вопросе этого не было.

Как обычно, вы читаете не все предложения. :bye:

А если вставляю ceil в макрофункцию, то компилятор ее в код тянет.

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


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

Вот чего творю:

#define DBL_MAXEPS    DBL_EPSILON * (1ULL << 32)

// #define TICK_NUM(Time)            (uint32_t)((1 - DBL_MAXEPS) + Time * SYSTICK_IRQ_CLK)
#define TICK_NUM(Time)            (uint32_t)(ceil(Time * SYSTICK_IRQ_CLK))

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


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

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

Как обычно, вы читаете не все предложения. :bye:

А если вставляю ceil в макрофункцию, то компилятор ее в код тянет.

Я читаю вопрос. И то что можно как-то понять. И если у вас в сообщении несколько противоречащих другу другу вопросов - так может надо правильно формулировать вопрос?

И как ещё можно понимать это?:

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

Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D?

 

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

Надо задать минимальный значащий разряд для максимального double числа, так думаю.

На это я и ответил.

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

Вот чего творю:

Зачем вообще при работе с целыми числами использовать double?

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


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

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

На это я и ответил.

За это спасибо. Но мне не подходит. И, похоже, вообще ничего не подойдет. Видимо, чисто макросами double не округлить.

Надо бежать на int. Считать время в наносекундах. 

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


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

56 minutes ago, ViKo said:

Не. Компилятор работает по IEEE754 Double precision 64-bit.IEEE754 Double precision 64-bit)IEEE754 Double precision 64-bit)

http://cppstudio.com/cat/309/315/

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


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

1 hour ago, ViKo said:

Есть DBL_EPSILON, которое гарантирует, что: 1 - DBL_EPSILON < 1.

Но это для 1. Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D?

Сейчас задаю (DBL_EPSILON * (1ULL << 32)), но не уверен. Надо задать минимальный значащий разряд для максимального double числа, так думаю. Нет ли у него стандартного названия?

Использую для вычисления в макрофункции. Потом я это D привожу к целому - округляю (ceil). Вот и хочу, чтобы

10.00000001 преобразовалось в 11, а не 10; а 10.00000000 в 10. 

Вам Ваше число перед округлением надо умножать на 1-DBL_EPSILON, так как операция умножения дает ошибку не блее последнего бита в мантиссе, а лучше умножить на 1-DBL_EPSILON*16. В этом случае не зависимо от того, какое у Вас число, вы его округлите до нужного. Вместо 16, можно взять целое число - степень 2, так, что эта степень будет меньше длинны мантиссы минус число значащих бит в целом, то есть если у вас двойная точность, а округляете в 32 битное беззнаковое целое минус 1, то 52-32-1=10, то есть 1-DBL_EPSILON*1024.

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


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

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

typedef unsigned long long u64;

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

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


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

9 минут назад, iiv сказал:

если у вас двойная точность, а округляете в 32 битное беззнаковое целое

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

Но как быть с неявной 1 в старшем разряде?  

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


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

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

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

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

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

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

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

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

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

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