2012-01-22 3 views
-2

Я пытаюсь взять два номера и получить их квадрат. Используя несколько чисел, некоторые работы, но это дает мне проблемы pow (.0305,2). Используя калькулятор, я получаю ответ: 0.093025; но когда я использую java, я получаю ответ: 9.609999999999999E-4. Мне нужно .0305, потому что я принимаю 3.05/100, что составляет .0305.неточно java.pow() results

Я нашел через испытание, что если я сделаю .pow (.305,2), это даст мне мой ответ на вопрос, но тогда мне нужно будет получить это с помощью 3.05/100.

EDIT: (добавление кода)

double weight=3.05; 
double TapeLength=100.00; 
double ftwt= weight/TapeLength; this gives me: 0.093025 
double ftwt= Math.pow(ftwt,2); //this gives me: 9.3025E-4 

все брошено как двойной.

+2

http://floating-point-gui.de/ –

+0

Пожалуйста, покажите пример кода, который демонстрирует проблему. –

+1

.0305 к силе 2 не 0.093025, поэтому я не верю, что вы получили этот результат на вашем калькуляторе. –

ответ

4

Если вы действительно получаете 9.609999999999999E-4, в результате вы делаете что-то неправильно, кроме того, что у вас есть в вопросе. Следующий код (в Eclipse, 3.7.1):

class Test { 
    public static void main(String args[]) { 
     double dd = .0305; 
     System.out.println (Math.pow(dd, 2)); 
     System.out.println ("%.8f\n", Math.pow(dd, 2)); 
    } 
} 

производит:

9.3025E-4 
0.00093025 

которые являются как правильно (а), просто выражается в различных форматах. Значение по умолчанию для double является экспоненциальным форматом в этом случае, но в последней строке показано, как вы можете получить разные форматы.


(а) Просто на случай, если вы запутались в экспоненциальной форме (на основе ваших комментариев), 0.00093025является же, как 9.3025E-4 с последнего средства 9.3025 x 10-4 (9.3025 с десятичная точка сдвигается на четыре позиции слева.

0

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

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

+0

Выполнение этого расчета в float не должно давать вам 9.6xxx. –

+0

Мне было лениво набирать мантиссу. Исправлена. Я просто доверяю оригинальному плакату, что он получает неправильные значащие цифры для экспоненциального – Luis

+0

. Он также не должен давать вам 0.00096xxx. Он должен дать вам 0.00093025. –

0

Использование Math.pow(x, 2) гораздо, гораздо медленнее, чем при использовании x * x это происходит потому, что это то же самое было Math.exp(Math.log(x) * n) Поскольку это делает гораздо больше вычислений, он имеет тенденцию иметь большую погрешность округления. (Так что я ts плохая идея со всех сторон IMHO)

Смежные вопросы