ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба Есть 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба Упражняюсь с этим калькулятором http://www.binaryconvert.com/result_double.html?hexadecimal=41E0000000200000 Не нахожу решения Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 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 Не оно ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 10 минут назад, dimka76 сказал: Не оно ? Не. Компилятор работает по IEEE754 Double precision 64-bit.IEEE754 Double precision 64-bit)IEEE754 Double precision 64-bit) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 46 минут назад, ViKo сказал: Но это для 1. Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D? Не оно?: DBL_MAX/(1ull << DBL_MANT_DIG - 1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 2 минуты назад, jcxz сказал: Не оно?: DBL_MAX/(1ull << DBL_MANT_DIG - 1) Может, и так. Но это число будет более 1. Округлением до целого тут не пахнет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 1 минуту назад, ViKo сказал: Может, и так. Но это число будет более 1. Округлением до целого тут не пахнет. Не понял при чём тут 1 и округление до целого? В исходном вопросе этого не было. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 2 минуты назад, jcxz сказал: В исходном вопросе этого не было. Как обычно, вы читаете не все предложения. А если вставляю ceil в макрофункцию, то компилятор ее в код тянет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба Вот чего творю: #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)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 7 минут назад, ViKo сказал: Как обычно, вы читаете не все предложения. А если вставляю ceil в макрофункцию, то компилятор ее в код тянет. Я читаю вопрос. И то что можно как-то понять. И если у вас в сообщении несколько противоречащих другу другу вопросов - так может надо правильно формулировать вопрос? И как ещё можно понимать это?: 1 час назад, ViKo сказал: Какое число EPS использовать для любого double числа D, чтобы было: D - EPS < D? 1 час назад, ViKo сказал: Надо задать минимальный значащий разряд для максимального double числа, так думаю. На это я и ответил. 3 минуты назад, ViKo сказал: Вот чего творю: Зачем вообще при работе с целыми числами использовать double? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 4 минуты назад, jcxz сказал: На это я и ответил. За это спасибо. Но мне не подходит. И, похоже, вообще ничего не подойдет. Видимо, чисто макросами double не округлить. Надо бежать на int. Считать время в наносекундах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimka76 42 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 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/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iiv 17 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба Если ТСу нужно именно преобразование в целый тип с округлением до ближайшего большего, то всё элементарно. Для положительных конечных чисел: typedef unsigned long long u64; #define CEIL(x) (((double)(u64)(x) >= (x)) ? (u64)(x): (u64)(x) + 1) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 9 минут назад, iiv сказал: если у вас двойная точность, а округляете в 32 битное беззнаковое целое Правильно. Только разрядов лишних есть 53 - 32 = 21. То есть, добавить к своему числу 1 - 2^-21. Но как быть с неявной 1 в старшем разряде? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться