powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / предсказуем ли результат?
4 сообщений из 54, страница 3 из 3
предсказуем ли результат?
    #38545645
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok jvm старается посчитать правильней,
Правда их "правильный" sin(Pi) еще чуть дальше от 0 чем "неправильный". :)
...
Рейтинг: 0 / 0
предсказуем ли результат?
    #38545784
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

я не очень спец в fpu, но насколько я смог, вышло как-то так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#include <stdio.h>
#include <stdlib.h>
#define _USE_MATH_DEFINES
#include <math.h>


double sin_fpu (double x){
    double r = 0.0l;
    asm("fldl %1;"
	"fsin;"
        "fstpl %0;" : "=m"(r): "m"(x) );
    return r;
}

int main(int argc, char ** argv){
    double x = sin(M_PI);
    printf("%.19g\n", x);
    x = sin_fpu(M_PI);
    printf("%.19g\n", x);
    return 0;
}



Результат:
1.224646799147353207e-16
1.224606353822377258e-16

Действительно, второе число ближе к нулю. И java считает по первому вариану. Хотя по вашей ссылке написано что java точнее. Странно. Видимо, sse не точное.
...
Рейтинг: 0 / 0
предсказуем ли результат?
    #38545917
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В math.h число определено с double precision
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
/* Traditional/XOPEN math constants (double precison) */
#ifndef __STRICT_ANSI__
#define M_E 2.7182818284590452354
#define M_LOG2E 1.4426950408889634074
#define M_LOG10E 0.43429448190325182765
#define M_LN2 0.69314718055994530942
#define M_LN10 2.30258509299404568402
#define M_PI 3.14159265358979323846



Думаю что недостаток младших разрядов (нехватка точности по сравнению с long double)
фактически нам говорит о том что в радианах M_PI это не развёрнутый 180 угол
(против часовой стрелки от оси OX) а слегка уменьшенный угол вида 180-epsilon.

Я не знаю как работает численный метод который расчитывает синус в FPU
(скорее всего это расчёт суммы ряда Тейлора или Лорана) но аргумент
перед подачей нормализуют (приводят к [ -M_PI/2.0 , M_PI/2.0 ])
и уже на этой операции мы можем иметь дефект аргумента. Тоесть
мы получаем не синус нуля а синус epsilon.

IMHO
...
Рейтинг: 0 / 0
предсказуем ли результат?
    #38546353
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonаргумент
перед подачей нормализуют (приводят к [ -M_PI/2.0 , M_PI/2.0 ])
и уже на этой операции мы можем иметь дефект аргумента.
IMHO

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

То есть, считая sin(M_PI) у нас M_PI не математическое, но и приведение к диапазону не использует математиически точное пи. В этом случае логично было бы предположить, что FPU должно было вычесть свое PI своей максимальной точности, которое равно M_PI, но тогда получился бы точно ноль.

Причем, M_PI-atan(1)*4 дает 0, это намекает, что M_PI задефайнено с максимальной точностью.
...
Рейтинг: 0 / 0
4 сообщений из 54, страница 3 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / предсказуем ли результат?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]