Nano Hash - криптовалюты, майнинг, программирование

C++: std::remquo не дает ожидаемого результата

Я пытаюсь найти количество раз, когда один двойник делится на другой в С++, и единственная функция, которую я нашел для этого, была remquo. Но при его использовании он не дает ожидаемых результатов, а результирующие частные находятся только между 0 и 3, когда они должны быть от 0 до 20.

удвоения меньшего размера работают, есть ли проблемы с более точными числами с плавающей запятой?

int quotient;
    double remainder = remquo((coordX+maxX), tileSizeX, &quotient);
    cout << coordX+maxX << " / " << tileSizeX << " = " << quotient << " r " << remainder << endl;
    return quotient;

В этом случае maxX будет 0,773, а coordX будет числом от -0,773 до 0,773 и, наконец, tileSizeX будет около 0,073619.

вот некоторые результаты вызова cout:

0,773 / 0,073619 = 2 r 0,0368095, но 0,073619 * 2 + 0,0368095 = 0,1840475, а не 0,773, как я ожидал.

0,085/0,073619 = 0 r 0,011381 ‹- неправильно

0,181 / 0,073619 = 2 r 0,0337619 ‹- справа

0,433 / 0,073619 = 3 r -0,00871429 ‹- неправильно

1,269 / 0,073619 = 0 r 0,0174762 ‹- неправильно

Остаток всегда кажется правильным, но частное почти никогда не бывает таковым. Есть что-то, чего я не понимаю.


  • Опубликуйте MCVE, а также укажите версию компилятора и ОС. 08.05.2019
  • Глядя на документацию, Кроме того, знак и, по крайней мере, три последних бита x/y будут сохранены в порядке, достаточном для определения октанта результата в пределах периода.. 3 бита не так уж и много. 08.05.2019
  • Также остаток определяется как Остаток IEEE с плавающей запятой операции деления x/y, вычисленный этой функцией, точно равен значению x - n*y, где значение n является целым числом, ближайшим к точному значению x/ у. Когда |n-x/y| = ½, значение n выбрано четным., а это не то, к чему вы пытаетесь относиться. 08.05.2019
  • MCVE важен, так как я думаю, что в вашем коде не показаны ошибки округления; 0,773/0,073619 на самом деле немного больше, чем 10,5 , поэтому остаток должен быть отрицательным, но вы показали положительный остаток (поэтому я подозреваю, что делитель не совсем соответствует показанному значению) 08.05.2019
  • NB. Я не помечал как обман (другой q на самом деле не обман), я vtc как не включая MCVE. Вы можете снова открыть, включив MCVE и скопировав результаты. 08.05.2019

Ответы:


1

Определение remquo включает (C11 7.12.10.3/1, на который ссылается C++17):

Функции remquo вычисляют тот же остаток, что и функции remainder. В объекте, на который указывает quo, они хранят значение, знак которого является знаком x/y и чья величина конгруэнтна по модулю 2n величине интегрального частного x/y, где n — это определяемая реализацией целое число больше или равно 3.

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


Я пытаюсь найти количество раз, когда один двойной делится на другой в С++

Существуют различные способы сделать это, например. std::trunc(x/y) или std::lrint(x/y). Также может быть полезно прочитать документацию для std::remainder и std::fmod. Вы можете посмотреть все эти функции на cppreference.com или в проектах ISO C и C++.

08.05.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..