Предположим, у меня есть иррациональное число, например \sqrt{3}
. Поскольку он иррационален, он не имеет десятичного представления. Поэтому, когда вы пытаетесь выразить это с помощью IEEE 754 double, вы введете ошибку.Могу ли я рассчитать ошибку, введенную двойными?
десятичное представление с большим количеством цифр:
1.7320508075688772935274463415058723669428052538103806280558069794519330169088
00037081146186757248575675...
Теперь, когда я вычислить \sqrt{3}
, я получаю 1.732051
:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
int main() {
double myVar = sqrt (3);
printf("as double:\t%f\n", myVar);
}
Согласно Wolfram|Alpha, у меня есть ошибка 1.11100... × 10^-7
.
Можно ли вычислить ошибку самостоятельно?
(я не против перехода на C++, Python или Java, я мог бы также использовать Mathematica, если нет простой альтернативы.)
Просто уточнить: я не хочу решение, которое работает только для sqrt {3}. Я хотел бы получить функцию, которая дает мне ошибку для любого числа. Если это невозможно, я, по крайней мере, хотел бы знать, как Wolfram | Alpha получает больше ценностей.
Моя попробовать
Во время написания этого вопроса, я нашел это:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h> // needed for higher precision
int main() {
long double r = sqrtl(3.0L);
printf("Precision: %d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
}
С этим, я могу получить ошибку до 2.0 * 10^-18
согласно Wolfram|Alpha. Поэтому я подумал, что это может быть достаточно близко, чтобы получить хорошую оценку ошибки. Я написал это:
#include <stdio.h> // printf
#include <math.h> // needed for sqrt
#include <float.h>
int main() {
double myVar = sqrt (3);
long double r = sqrtl(3.0L);
long double error = abs(r-myVar)/r;
printf("Double:\t\t%f\n", myVar);
printf("Precision:\t%d digits; %.*Lg\n",LDBL_DIG,LDBL_DIG,r);
printf("Error:\t\t%.*Lg\n", LDBL_DIG, error);
}
Но он выводит:
Double: 1.732051
Precision: 18 digits; 1.73205080756887729
Error: 0
Как я могу исправить это, чтобы получить ошибку?
Итак, вы задаете два вопроса здесь? Как вы вычисляете ошибку в своем ответе, а также что не так со вторым блоком кода? – Mike
@Mike: Да, я задаю два вопроса. Я сделал второй более точный. Поэтому, если на второй ответят, на первый ответ автоматически ответят. Если первый получает ответ, мне не нужен ответ для второго. –