потеря точности плавающей точки C++: 3015/0.00025298219406977296

Я наконец понял, как использовать Maven. Из Eclipse создайте новый проект Maven.

Загрузите Maven, извлеките архив, добавьте папку /bin в путь.

Проверить установку из командной строки, запустив mvn -v (будет печатать версию и путь установки java)

Изменить на корневую папку проекта (где находится pom.xml) и запустить :

mvn dependency:copy-dependencies

Все jar-файлы загружаются в /target/dependency.

Чтобы установить другой выходной каталог:

mvn dependency:copy-dependencies -DoutputDirectory="c:\temp"

Теперь можно повторно использовать этот проект Maven для всех загрузок зависимостей, изменив pom.xml

Добавить jars в java-проект по пути сборки -> настроить путь сборки -> библиотеки -> добавить JAR ..

17
задан Josh Lee 28 March 2010 в 17:45
поделиться

5 ответов

Используете ли вы directx в своей программе где-либо, поскольку это приводит к переключению блока с плавающей запятой в режим одинарной точности, если вы специально не укажете, чтобы не делать этого при создании устройство и вызовет именно это

15
ответ дан 30 November 2019 в 13:34
поделиться

Интересно, что если вы объявите a и b как числа с плавающей точкой, вы получите ровно 11917835.000000000. Поэтому я предполагаю, что где-то происходит преобразование в одинарную точность, либо в том, как константы интерпретируются, либо позже в вычислениях.

Любой случай немного удивителен, учитывая, насколько прост ваш код. Вы не используете какие-либо экзотические директивы компилятора, форсирующие одинарную точность для всех чисел с плавающей запятой?

Редактировать: Вы действительно подтвердили, что скомпилированная программа выдает неверный результат? В противном случае наиболее вероятным кандидатом для (ошибочного) преобразования с одинарной точностью будет отладчик.

4
ответ дан 30 November 2019 в 13:34
поделиться

Я предполагаю, что вы печатаете номер без указания точности. Попробуйте следующее:

#include <iostream>
#include <iomanip>

int main() { 
    double a = 3015.0; 
    double b = 0.00025298219406977296;
    double f = a/b;

    std::cout << std::fixed << std::setprecision(15) << f << std::endl;
    return 0;
}

Это дает:

11917834.814763514000000

Что мне кажется правильным. Я использую VC ++ 2008 вместо 2005, но я предполагаю, что разница в вашем коде, а не в компиляторе.

1
ответ дан 30 November 2019 в 13:34
поделиться

Вы уверены, что проверяете значение f сразу после инструкции fstp? Если у вас включена оптимизация, возможно, окно просмотра может показывать значение, полученное в какой-то более поздний момент (это кажется немного правдоподобным, поскольку вы говорите, что смотрите на дробную часть f позже - некоторые инструкции маскируют его каким-то образом?)

0
ответ дан 30 November 2019 в 13:34
поделиться

Если вам нужна точная математика, не используйте числа с плавающей запятой.

Сделайте себе одолжение и получите библиотеку BigNum с поддержкой рациональных чисел.

2
ответ дан 30 November 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: