jcxz 234 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 13 мая, 2019 Опубликовано 13 мая, 2019 · Жалоба 25 minutes ago, jcxz said: Плавучие они у вас, потому что не понимаете что такое фикс.точка. И 5мс и 20нс легко фикс.точкой записываются. Не 11 в экспоненте double разрядов, а только 10. 53+10+1 вроде бы double это плавающая точка, а фиксированная long long (ну и какие вопросы к фиксированной могут быть - там 1<<32) 53+2**10+1 - тож экспонента, иначе добавили бы просто к мантиссе лишних битов и не геммороились (а в железе float point сложение сделать дофига кремния нужно) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 8 часов назад, jcxz сказал: Плавучие они у вас, потому что не понимаете что такое фикс.точка. И 5мс и 20нс легко фикс.точкой записываются. Не 11 в экспоненте double разрядов, а только 10. 53+10+1 И каким образом компилятор будет округлять такие числа? 1 разряд знак, 11 разрядов экспонента, 1 скрытый + 52 разряда мантисса. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 3 часа назад, ViKo сказал: И каким образом компилятор будет округлять такие числа? Округляет не компилятор, а программист. Так, как ему надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 15 hours ago, ViKo said: Так у меня давно сделано. Хотел "покрасивее". Не надо время в floating point хранить и/или обрабатывать, учитесь на чужих ошибках - https://habr.com/ru/company/pvs-studio/blog/312890/ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 15 часов назад, yes сказал: 11 разрядов, то есть влево можно сдвинуть на ~1000 позиций, ну еще хвост из 53, то есть младший бит на уровне 1<<950, на фоне этого 1<<32 глубокий 0 или я что-то не понимаю? Это двоичные разряды, не десятичные. 27 минут назад, xvr сказал: Не надо время в floating point хранить и/или обрабатывать, учитесь на чужих ошибках Убедили! Я, правда, не храню, а только вычисляю при компиляции. И в double. Но всё равно прекращаю. Потому, что эта добавка для ceil округления любого double до 32-битового целого получается не такая уж малая, - 1e-6 + 1, по последним экспериментам. Т.е., моя задержка может оказаться на 1 мкс меньше, чем надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба я понимаю, что, что-то не понимаю, но вот >> 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба Вы показали, что из почти максимального double сколько ни отнимай 2^32, число не меняется. У меня был другой вопрос. Мне нужно было для double числа 2^32 найти такое минимальное double, вычитание которого из 2^32 изменит это 2^32. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 7 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 16 минут назад, megajohn сказал: пять минут писанины Где запускали на выполнение? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 7 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 4 минуты назад, ViKo сказал: Где запускали на выполнение? MSVC 2015 вот тут же такой же результат https://onlinegdb.com/BJA5GHO3N Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба Спасибо. Да, всё просто и красиво. Я здесь потыкался, но не вышло. http://codepad.org/KiNOFIeB Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
megajohn 7 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба 2 минуты назад, ViKo сказал: Я здесь потыкался, но не вышло. http://codepad.org/KiNOFIeB Не прошли тест на профпригодность =) вот http://codepad.org/F8xqwhic Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба Вы тоже свой исходник поправили. И результаты были разными. Для b /= 1.0001; found 2.385379e-07 b /= 1.00000001 found 2.384186e-07 И я уже вернулся к старым добрым целым предсказуемым наносекундам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 7 14 мая, 2019 Опубликовано 14 мая, 2019 · Жалоба можно меньше :) 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться