powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / strictfp
39 сообщений из 39, показаны все 2 страниц
strictfp
    #37803259
hybrid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет.

я новичок в джава и у меня такая проблема:

написал метод:

private strictfp double calculate(double x, double y, String oper) {
double res = 0;
if (oper.equals("+")) {
res = x + y;
} else if (oper.equals("-")) {
res = x - y;
} else if (oper.equals("*")) {
res = x * y;
} else if (oper.equals("/")) {
res = x / y;
} else if (oper.equals("=")) {
res = x;
}
return res;
}

но при некоторых вычислениях он все равно считает неправильно. Например, 1.2 * 3 = 3.59999999996

В чем может быть проблема?
...
Рейтинг: 0 / 0
strictfp
    #37803273
rsltr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hybrid,

Код: java
1.
DecimalFormat format = new DecimalFormat("#.##"); 
...
Рейтинг: 0 / 0
strictfp
    #37803281
hybrid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rsltr, а как его использовать?
...
Рейтинг: 0 / 0
strictfp
    #37803284
hybrid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я пишу калькулятор, округления делать нельзя
...
Рейтинг: 0 / 0
strictfp
    #37803290
Nixic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо Double используйте BigDecimal
Много раз уже обсуждалось и тут и в гугле.
...
Рейтинг: 0 / 0
strictfp
    #37803305
hybrid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Nixic, спасибо
...
Рейтинг: 0 / 0
strictfp
    #37803398
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
hybrid,
можно для начала просто strictfp из объявления метода убрать
...
Рейтинг: 0 / 0
strictfp
    #37803713
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkhybrid,
можно для начала просто strictfp из объявления метода убрать
1. Как тут влияет stractfp?
2. Это убрать можно, но это не первое. Первое - разобраться с тем, как представляются десятичные числа (double) в компьютере и какие могут быть с этим проблемы.
...
Рейтинг: 0 / 0
strictfp
    #37804099
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonidvavp.mkhybrid,
можно для начала просто strictfp из объявления метода убрать
1. Как тут влияет stractfp?
Как-то так.
http://cloud-cuckoo.com.ua/content/java-strictfp-metody

Leonidv2. Это убрать можно, но это не первое. Первое - разобраться с тем, как представляются десятичные числа (double) в компьютере и какие могут быть с этим проблемы.
По-моему стереть одно слово и перекомпилировать программу значительно быстрее, чем в чём-нибудь разбираться...

То, что он разберётся - как это решит его проблему?
...
Рейтинг: 0 / 0
strictfp
    #37804170
rfq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Считает-то он правильно. Неизбежная ошибка возникает при преобразовании 1.2 в двоичный вид. Это как если бы ты пытался 1/3 представить в десятичном виде - все равно будет ошибка.
...
Рейтинг: 0 / 0
strictfp
    #37804241
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Когда обучаешься чем либо, лучше разбираться. И да, sctrictfp здесь не причем.
...
Рейтинг: 0 / 0
strictfp
    #37804261
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonidvsctrictfp
Для чего он нужен по-вашему?
...
Рейтинг: 0 / 0
strictfp
    #37804782
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rfqСчитает-то он правильно. Неизбежная ошибка возникает при преобразовании 1.2 в двоичный вид. Это как если бы ты пытался 1/3 представить в десятичном виде - все равно будет ошибка.
Размялся маленько. На глаз вроде правильно. Проверить нечем.
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
public class JavaApp {

    public static void main(String args[]) {
        System.out.println(toBinaryString(1.5));
        System.out.println(toBinaryString(1.2));
        System.out.println(toBinaryString(1.02));
        System.out.println(toBinaryString(1.002));
        System.out.println(toBinaryString(1.0002));
        System.out.println(toBinaryString(1.00002));
        System.out.println(toBinaryString(1.000002));
        System.out.println(toBinaryString(1.0000002));
        System.out.println(toBinaryString(1.00000002));
    }
    private final static char SEPARATOR = ',';
    private final static int ДОСТАТОЧНО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ = 70;

    public static String toBinaryString(double value) {
        long integerPart = (long) value;
//        double fractionalPart = (value % 1);

//      так лучше
        double fractionalPart = value - integerPart;

//        System.out.println(integerPart);
//        System.out.println(fractionalPart);

        StringBuilder sb = new StringBuilder(Long.toBinaryString(integerPart));

        if (fractionalPart > 0) {
            sb.append(SEPARATOR);

            double etl = .5;
            int cntr = 0;

            do {
                if (fractionalPart >= etl) {
                    sb.append('1');
                    fractionalPart -= etl;
                } else {
                    sb.append('0');
                }

                etl /= 2;
            } while (fractionalPart > 0 && (++cntr < ДОСТАТОЧНО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ));
        }
        return sb.toString();
    }
}
...
Рейтинг: 0 / 0
strictfp
    #37804855
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Или даже так (предидущий не работал бы с отрицатеьными величинами)
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
public class JavaApp {
    public static void main (String args[]) {
        System.out.println(toBinaryString(1.2));
        System.out.println(toBinaryString(1.02));
        System.out.println(toBinaryString(1.002));
        System.out.println(toBinaryString(1.0002));
        System.out.println(toBinaryString(1.00002));
        System.out.println(toBinaryString(1.000002));
        System.out.println(toBinaryString(1.0000002));
        System.out.println(toBinaryString(1.00000002));
        System.out.println(toBinaryString(1.000000002));
        System.out.println(toBinaryString(1.0000000002));
        System.out.println(toBinaryString(1.00000000002));
        System.out.println(toBinaryString(1.000000000002));
        System.out.println(toBinaryString(1.0000000000002));
        System.out.println(toBinaryString(1.00000000000002));
        System.out.println(toBinaryString(1.000000000000002));
        System.out.println(toBinaryString(1.0000000000000002));
        System.out.println(toBinaryString(1.00000000000000002));
        System.out.println(toBinaryString(1.000000000000000002));
        System.out.println(toBinaryString(1.0000000000000000002));
        System.out.println(toBinaryString(1.00000000000000000002));
        System.out.println(toBinaryString(1.000000000000000000002));
        System.out.println(toBinaryString(1.0000000000000000000002));
        
        System.out.println(toBinaryString(-1.2));
        System.out.println(toBinaryString(-1.02));
        System.out.println(toBinaryString(-1.002));
        System.out.println(toBinaryString(-1.0002));
        System.out.println(toBinaryString(-1.00002));
        System.out.println(toBinaryString(-1.000002));
        System.out.println(toBinaryString(-1.0000002));
        System.out.println(toBinaryString(-1.00000002));
        System.out.println(toBinaryString(-1.000000002));
        System.out.println(toBinaryString(-1.0000000002));
        System.out.println(toBinaryString(-1.00000000002));
        System.out.println(toBinaryString(-1.000000000002));
        System.out.println(toBinaryString(-1.0000000000002));
        System.out.println(toBinaryString(-1.00000000000002));
        System.out.println(toBinaryString(-1.000000000000002));
        System.out.println(toBinaryString(-1.0000000000000002));
        System.out.println(toBinaryString(-1.00000000000000002));
        System.out.println(toBinaryString(-1.000000000000000002));
        System.out.println(toBinaryString(-1.0000000000000000002));
        System.out.println(toBinaryString(-1.00000000000000000002));
        System.out.println(toBinaryString(-1.000000000000000000002));
        System.out.println(toBinaryString(-1.0000000000000000000002));
    }
    private final static char SEPARATOR = ',';
    private final static int ДОСТАТОЧНО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ = 700;

    public static String toBinaryString(double value) {
        StringBuilder sb;
        if (value < 0) {
            sb = new StringBuilder("-");
            value = Math.abs(value);
        } else if (value == 0) {
            return "0";
        } else {
            sb = new StringBuilder();
        }
        
        long integerPart = (long) value;
        double fractionalPart = value - integerPart;

        sb.append(Long.toBinaryString(integerPart));

        if (fractionalPart != 0) {
            sb.append(SEPARATOR);

            double etl = .5;
            int cntr = 0;

            do {
                if (fractionalPart >= etl) {
                    sb.append('1');
                    fractionalPart -= etl;
                } else {
                    sb.append('0');
                }

                etl /= 2;
            } while (fractionalPart > 0 && (++cntr < ДОСТАТОЧНО_ЗНАКОВ_ПОСЛЕ_ЗАПЯТОЙ));
        }
        return sb.toString();
    }
}
...
Рейтинг: 0 / 0
strictfp
    #37804898
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk,

Чем это лучше String.format("%.70f", 1.02)?

И да, вы показываете, что не понимаете обработку вещественных чисел.
...
Рейтинг: 0 / 0
strictfp
    #37805266
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonidvavp.mk,
Чем это лучше String.format("%.70f", 1.02)?
К сожалению они делают разные вещи, их несколько сложно сравнивать =)

LeonidvИ да, вы показываете, что не понимаете обработку вещественных чисел.
Где это я так прокололся, что вы разгадали мой секрет?)
...
Рейтинг: 0 / 0
strictfp
    #37805288
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkLeonidvavp.mk,
Чем это лучше String.format("%.70f", 1.02)?
К сожалению они делают разные вещи, их несколько сложно сравнивать =)

И что делает ваша функция.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
strictfp
    #38383748
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хм....

Прошу прощения за внезапный ап.
Код: 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.
26.
27.
28.
import static java.lang.Math.PI;

public class testStrictFp{


        public strictfp static void testStrictCallback(){
                double x=1.0/PI;
                float y=(float)1.0/(float)PI;
                System.out.println("Double:"+ x);
                System.out.println("Float:"+ y);
        }

        public static void testNonStrictCallback(){
                double x=1.0/PI;
                float y=(float)1.0/(float)PI;
                System.out.println("Double:"+ x);
                System.out.println("Float:"+ y);
        }

        public static void main(String[] args) throws Exception{

                testStrictCallback();
                testNonStrictCallback();

        }


}



Double:0.3183098861837907
Float:0.31830987
Double:0.3183098861837907
Float:0.31830987
...
Рейтинг: 0 / 0
strictfp
    #38384312
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

Я не понял вопроса)

P.S. Тема у функций одинаковые.. Так должно быть?
...
Рейтинг: 0 / 0
strictfp
    #38384315
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
*тела
...
Рейтинг: 0 / 0
strictfp
    #38384345
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вот и думаю. Должно или не должно.

The Java® Virtual
Machine Specification
Java SE 7 Edition 2.8.2 Floating-Point Modes
Every method has a floating-point mode, which is either FP-strict or not FPstrict.
The floating-point mode of a method is determined by the setting of the
ACC_STRICT flag of the access_flags item of the method_info structure (§4.6)
defining the method. A method for which this flag is set is FP-strict; otherwise, the
method is not FP-strict.
...
Рейтинг: 0 / 0
strictfp
    #38384403
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
strictfp гарантирует одинаковость результатов на разных (со)процессорах.
Смысл гонять такие тесты на одном и том же сопроцессоре одного и того же интела.
Вот если у вас под руками Power и ARM - да, интересно.
...
Рейтинг: 0 / 0
strictfp
    #38384493
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОК. Я понял. Я просто другой смысл узрел в документации по JVM. ну да ладно. Всем спасибо.
...
Рейтинг: 0 / 0
strictfp
    #38384566
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не с float :)
...
Рейтинг: 0 / 0
strictfp
    #38384636
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатора. Может в VM есть флаг который определяет ограничивать точность всех расчётов или нет? (и по умолчанию он установлен)

TestStrictFp
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
package teststrictfp;

import static java.lang.Math.PI;

public class TestStrictFp {

    public static double first(double x, double y) {
        return PI * x / y;
    }

    public static strictfp double firstStricted(double x, double y) {
        return PI * x / y;
    }

//    public static double second(double x, double y) { return PI * (x / y); }
//    public static strictfp double secondStricted(double x, double y) { return PI * (x / y); }
    
    public static void main(String[] args) throws Exception {
        double y = 1.2;

        int counter = 0;
        for (double x = 0; x < 1_000_000_000; x += 0.00000000001) {
            //<editor-fold defaultstate="collapsed" desc="noise">
            if (++counter % 2_000_000_000 == 0) {
//            if (++counter % 100_000_000 == 0) {
                System.out.printf("\t\t\t\t\t\tworks %f\n", x);
            }
            //</editor-fold>

            double //
                    first = first(x, y),
                    firstStricted = firstStricted(x, y);
//                    second = second(x, y),
//                    secondStricted = secondStricted(x, y);

            if (first != firstStricted) {
                System.out.printf("found!\n"
                        + "first           : %s\n"
                        + "first_stricted  : %s\n",
                        first, firstStricted);
                return;
            }
        }
    }
}

...
Рейтинг: 0 / 0
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
39 сообщений из 39, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / strictfp
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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