powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / strictfp
14 сообщений из 39, страница 2 из 2
strictfp
    #38384975
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатора.
И не должно. У вас там вроде бы нигде большая (или маленькая) экспонента не получается. Поэтому и разницы никакой. Да и не факт, что ваша JVM использует extended expontent value set.

Может в VM есть флаг который определяет ограничивать точность всех расчётов или нет? (и по умолчанию он установлен)
Точность (количество значимых битов в мантисе) фиксировано и одинаково как для strictfp, так и для не strictfp методов. strictfp может влиять только на диапазон (range) представляемых значений, но не на точность. Читайте JLS 4.2.3, 15.4
...
Рейтинг: 0 / 0
strictfp
    #38385594
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатораstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них.
В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет.

P.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают?
...
Рейтинг: 0 / 0
strictfp
    #38385875
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них.
В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет.
AMD.. (ну наверное это не важно)

[offtop]
Basil A. SidorovP.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают?
Не знаю. Думаю врятли в институтах что-то кроме паинта изучают (сделал такой вывод исходя из того насколько тупые студенты приходят к нам на практику).
Я изучаю гидравлику, сопромат, детали машин и всякое такое г..
[offtop]
...
Рейтинг: 0 / 0
strictfp
    #38385892
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkAMD.. (ну наверное это не важно)8087 делала AMD или что?
...
Рейтинг: 0 / 0
strictfp
    #38385918
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovavp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатораstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них.
В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет.

P.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают?
Я по старинке считал что JVM использует FPU если есть. Если нет - эмулирует программно
на всяких мобилках и прочих стриральных машинках.

Архитектурно FPU состоит из 8 штук 80-битных регистров с которыми он и выполняет
операции как стековая машина (LIFO). Насколько я понимаю загрузить в него 32-х битный
или 64-х битное число невозможно. Любые числа кастятся в 80 битные. Потом над ними
выполняются операции. Результат операции можно извлечь обратно и снова закастить
в float или double с отсечением точности.
...
Рейтинг: 0 / 0
strictfp
    #38385956
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. Sidorovstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них.
В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет.
Что ж не влияет? Просветите хоть вы))
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
package teststrictfp;

public class TestStrictFp {

    public static          double   normal(double x, double y) { return x + y; }
    public static strictfp double stricted(double x, double y) { return x + y; }

    public static void main(String[] args) throws Exception {
        double
                x = 1e+300,
                y = 1e-300;
        
        System.out.println(x + " и " + y);
        
        System.out.println(
                normal(x, y) == stricted(x, y)
                ? "Мало отличаютсяся (по порядкам) денормализация не требуется"
                : "Отличаютсяся (по порядкам) денормализация требуется");
    }
}
...
Рейтинг: 0 / 0
strictfp
    #38386883
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk
Код: java
1.
2.
3.
        double
                x = 1e+300,
                y = 1e-300;

А с каких пор (строгий) ноль стал на что-то влиять?
У 80-битного extended 16 запасных двоичных разрядов, а не ~2000.
...
Рейтинг: 0 / 0
strictfp
    #38386890
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonАрхитектурно FPU состоит ...Почитайте лучше про денормализацию, почему её использует и как это влияет на конечный результат при разной точности промежуточных.
...
Рейтинг: 0 / 0
strictfp
    #38386898
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovmaytonАрхитектурно FPU состоит ...Почитайте лучше про денормализацию, почему её использует и как это влияет на конечный результат при разной точности промежуточных.
Я много чего знаю про денормализацию. Из теории проектирования БД. Но у вас очевидно есть
другой смысл этого термина. Дайте сссылку на пруф.
...
Рейтинг: 0 / 0
strictfp
    #38386950
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonЯ много чего знаю про денормализацию. Из теории проектирования БД. Но у вас очевидно есть
другой смысл этого терминаСпросите у гугла про IEEE 754 .
Если вкратце, то представление вещественных чисел неоднозначно: 1.0e1 и 0.1e2 - одно и то же число.
При нормализации "в терминах IEEE 754" порядок выбирается таким образом, чтобы старший бит мантиссы был единичным. Этот "нормализованный бит" не хранится в (бинарном) представлении числа явным образом, что позволяет увеличить точность на один разряд.
Если отказаться от денормализации, то в процессе масшабирования, которое необходимо при сложении-вычитании, рано или поздно возникнет ситуация, когда масштабируемое число превратится в ноль. С денормализованными числами мы теряем точность, но получаем запас в несколько порядков на масштабирование.
Аналогичным образом, денормализация может потребоваться при делении "достаточного малого" числа на "достаточно большое" и при перемножении "достаточно малых" чисел.

Интеловский extended - денормализованный, что, собственно, и позволяет сопроцессору не терять скорость при вычислениях - все затраты по (де)нормализации приходятся на загрузку/сохранение double/float.
...
Рейтинг: 0 / 0
strictfp
    #38387024
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovА с каких пор (строгий) ноль стал на что-то влиять?
Как же всё-таки увидеть разницу, о мудрейший?



TestStrictFp.java
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
package teststrictfp;

import static java.lang.Double.parseDouble;

public class TestStrictFp {

    public static          double   normal(double x, double y) { return x + y; }
    public static strictfp double stricted(double x, double y) { return x + y; }

    public static void main(String[] args) {
        for (int i = 0; i <= 308; ++i) {
            double x = parseDouble("1e+" + i),
                   y = parseDouble("1e-" + i);

            System.out.printf("%s и %s\n", x, y);

            if (normal(x, y) == stricted(x, y)) {
                System.out.println("Мало отличаютсяся (по порядкам) денормализация не требуется\n");
            } else {
                System.out.println("Отличаютсяся (по порядкам) денормализация требуется!!!!!");
                return;
            }
        }
    }
}

...
Рейтинг: 0 / 0
strictfp
    #38387180
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkКак же всё-таки увидеть разницу, о мудрейший?Использовать числа, содержащие единицы во всех (бинарных) разрядах мантиссы масштабируемого числа.

P.S. Возьмите лист бумаги, карандаш или ручку и поскладывайте в столбик. Будет более продуктивно, чем перебирать несколько более 2^52 вариантов.
...
Рейтинг: 0 / 0
strictfp
    #38387182
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorovнесколько более менее 2^52 вариантов.
...
Рейтинг: 0 / 0
strictfp
    #38388950
maxkar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Я повторю. strictfp не может влиять на точность вычислений. Не может. Единственное, на что он может влиять - так это на возможность получить какое-то значение вместо NaN/0. Все. Больше значащих бит strictfp дать не может по определению. Мантисса всегда имеет одну и ту же длину. Если я правильно помню, при передаче параметров в/из методов они тоже приводятся к набору чисел со стандартной экспонентой.

Так что разницу нужно искать на коде вроде:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class SP {
  public static double test(double a, double b, double c) {
    return a * b / c;
  }

  public static void main(String[] args) {
    System.out.println(test(1e-320, 1e-4, 1e-4));
  }
}



И не факт еще, что разница будет. Она может быть, но ее может и не быть. Т.е. на каких-то архитектурах все вычисления автоматически будут strictfp.
...
Рейтинг: 0 / 0
14 сообщений из 39, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / strictfp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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