Re[7]: Глюки c переенными типа double!!!!!
От: Blazkowicz Россия  
Дата: 14.03.07 14:44
Оценка: 4 (4) +5 :))) :))) :)
Здравствуйте, chili1, Вы писали:

К>>Клёвый компилятор Формат у принтф хотябы какой?


C>Очень смешно! Просто самому ржать хочется.

C>Microsoft Visual C++ v. 6.0
C>
C>printf("%f",a3);
C>


http://www.cplusplus.com/reference/clibrary/cstdio/printf.html

For e, E and f specifiers: this is the number of digits to be printed after the decimal point.
When no precision is specified, the default is 1. If the period is specified without an explicit value for precision, 0 is assumed.


Картина маслом: Java девелоперы тыкают носом в документацию по C++.
Глюки c переенными типа double!!!!!
От: chili1  
Дата: 14.03.07 13:50
Оценка: :))) :))) :))) :))) :))
Столкнулся с такой проблемой: при перемножении типов double возвращаются не объяснимые результаты

Код:
        double a1 = 0.3;
        double a2 = 3;
        double a3 = a1*a2;
        System.out.append(""+a3 + "\n");

Результат:
0.8999999999999999

        double a1 = Double.valueOf("0.3");
        double a2 = Double.valueOf("3");
        double a3 = a1*a2;
        System.out.append(""+a3 + "\n");

Результат:
0.8999999999999999

Даже если создавать классы Double, возвращается тоже самое!

Проблему удалось решить только при использовании класса BigDecimal(String digits).
А вот если создавать объект и передавать туда !String:
        BigDecimal a1 = new BigDecimal(0.3);//передавать значения !String
        BigDecimal a2 = new BigDecimal(3);//передавать значения !String
        BigDecimal a3 = a1.multiply(a2);
        System.out.append(""+a3 + "\n");


Результат становиться более крутым:
0.899999999999999966693309261245303787291049957275390625

Так вот такая операция работает правильно только при использовании класса BigDecimal с коструктором BigDecimal(String digits).

        BigDecimal a1 = new BigDecimal("0.3");
        BigDecimal a2 = new BigDecimal("3");
        BigDecimal a3 = a1.multiply(a2);
        System.out.append(""+a3 + "\n");

Результат:
0.9

Вы только не поймите, что такой глюк только на сочетании 2-х чисел (0.3,3). А их много...

В чем дело? Как это лечиться?
Re: Глюки c переенными типа double!!!!!
От: dimok@  
Дата: 14.03.07 13:58
Оценка: 9 (1)
Вроде бы на первых курсах компьютерных специальностей подробно описывают двоичное представление вещественных чисел. Может настало время вспомнить основы. Потому что, скорее всего, еще больше "глюков" будет при сравнениях double.

А за объяснением причин "глюка" в поиск, уже много раз он "проявлялся".
Re[3]: Глюки c переенными типа double!!!!!
От: GarryIV  
Дата: 15.03.07 07:16
Оценка: 8 (1)
Здравствуйте, chili1, Вы писали:

D>>Вроде бы на первых курсах компьютерных специальностей подробно описывают двоичное представление вещественных чисел. Может настало время вспомнить основы. Потому что, скорее всего, еще больше "глюков" будет при сравнениях double.


D>>А за объяснением причин "глюка" в поиск, уже много раз он "проявлялся".


C>А Вы попробуйте выполнить тот же код в С++:


C>
C>       double a1 = 0.3;
C>       double a2 = 3;
C>       double a3 = a1*a2;
C>


C>Результат будет:

C>0.9

C>Тут то тогда что?


Тогда попробуй поискать сабж в конференции по с++, там этот вопрос в TOP 10.
WBR, Igor Evgrafov
Re[4]: Глюки c переенными типа double!!!!!
От: chili1  
Дата: 14.03.07 14:26
Оценка: :)
D>Какой компилятор? Где результат смотрим?

Выводим в консоль при помощи printf.
Re[3]: Глюки c переенными типа double!!!!!
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 14.03.07 14:29
Оценка: -1
Здравствуйте, chili1, Вы писали:
C>А Вы попробуйте выполнить тот же код в С++:

C>Результат будет:

C>0.9

C>Тут то тогда что?

Ну и хорошо, что Java на простых случаях ошибку показывает. Конечно, надо в спецификацию C++ смотреть, но в принципе не факт что где-нибудь C++ не выдаст ту же ерунду (точнее факт, что выдаст). Только в этом случае ошибку будет найти труднее. Если не ошибаюсь, это все хорошо расписано у Бен Ари в "Языки программирования". Хотя может и ошибаюсь.
http://jvmmemory.com — простой способ настройки JVM
Re: Глюки c переенными типа double!!!!!
От: zubr Россия  
Дата: 14.03.07 13:59
Оценка:
А по моему ничего страшного...
Вы выполняете операции над переменными вещественного типа, соответственно ждите погрешности...
0.8(9) ~ 0.9
отсюда
[quote]
The values returned by operators on floating-point numbers are those specified by IEEE 754. In particular, the Java programming language requires support of IEEE 754 denormalized floating-point numbers and gradual underflow, which make it easier to prove desirable properties of particular numerical algorithms.
[/quote]
Re[2]: Глюки c переенными типа double!!!!!
От: chili1  
Дата: 14.03.07 14:15
Оценка:
Здравствуйте, dimok@, Вы писали:

D>Вроде бы на первых курсах компьютерных специальностей подробно описывают двоичное представление вещественных чисел. Может настало время вспомнить основы. Потому что, скорее всего, еще больше "глюков" будет при сравнениях double.


D>А за объяснением причин "глюка" в поиск, уже много раз он "проявлялся".


А Вы попробуйте выполнить тот же код в С++:

       double a1 = 0.3;
       double a2 = 3;
       double a3 = a1*a2;


Результат будет:
0.9

Тут то тогда что?
Re[3]: Глюки c переенными типа double!!!!!
От: dimok@  
Дата: 14.03.07 14:20
Оценка:
Здравствуйте, chili1, Вы писали:

C>А Вы попробуйте выполнить тот же код в С++:


C>
C>       double a1 = 0.3;
C>       double a2 = 3;
C>       double a3 = a1*a2;
C>


C>Результат будет:

C>0.9

C>Тут то тогда что?


Какой компилятор? Где результат смотрим?
Re[5]: Глюки c переенными типа double!!!!!
От: Курилка Россия http://kirya.narod.ru/
Дата: 14.03.07 14:28
Оценка:
Здравствуйте, chili1, Вы писали:

D>>Какой компилятор? Где результат смотрим?


C>Выводим в консоль при помощи printf.


Клёвый компилятор Формат у принтф хотябы какой?
Re[6]: Глюки c переенными типа double!!!!!
От: chili1  
Дата: 14.03.07 14:38
Оценка:
К>Клёвый компилятор Формат у принтф хотябы какой?

Очень смешно! Просто самому ржать хочется.
Microsoft Visual C++ v. 6.0
printf("%f",a3);
Re[3]: Глюки c переенными типа double!!!!!
От: Blazkowicz Россия  
Дата: 14.03.07 14:39
Оценка:
Здравствуйте, chili1, Вы писали:

C>А Вы попробуйте выполнить тот же код в С++:

Сильный довод. Показывает что про то как числа представляются в памяти в виде битов ты не знаешь не только в случае Java но и в C++ тоже.

C>Результат будет:

C>0.9
C>Тут то тогда что?
Округление на любом уровне. Хоть при выводе на консоль, хоть ещё где.

Вот вижу по C++
http://www.thescripts.com/forum/thread166837.html
Те же проблемы что и у всего человечества. Не все десятичные дроби можно представить конечной записью в двоичной системе.
Re[7]: Глюки c переенными типа double!!!!!
От: toxin Россия  
Дата: 15.03.07 07:53
Оценка:
Здравствуйте, chili1, Вы писали:

C>Очень смешно! Просто самому ржать хочется.

C>Microsoft Visual C++ v. 6.0
C>
C>printf("%f",a3);
C>


А почему тогда:
  double a1 = 0.3;
  double a2 = 3;
    double a3 = a1*a2;
    System.out.append(""+a3 + "\n");


для эквивалентности должно быть так:
  double a1 = 0.3;
  double a2 = 3;
    double a3 = a1*a2;
    System.out.printf("%f", a3);


выводит 0,900000. все в норме
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Глюки c переенными типа double!!!!!
От: abarmot  
Дата: 15.03.07 09:09
Оценка:
Z> 0.8(9) ~ 0.9

Не примерно, а строго равно.

x = 0.8(9);

10x — x
= 10 * 0.8(9) — 0.8(9)
= 8.9(9) — 0.8(9)
= 8.1
=> 9x = 8.1
=> x = 8.1 / 9
=> x = 0.9
Re[3]: Глюки c переенными типа double!!!!!
От: tavr  
Дата: 16.03.07 16:03
Оценка:
Здравствуйте, abarmot, Вы писали:


Z>> 0.8(9) ~ 0.9


A>Не примерно, а строго равно.

строго только на бесконечности, регистры процессора пока конечны
Re: Глюки c переенными типа double!!!!!
От: Аноним  
Дата: 16.03.07 20:35
Оценка:
Здравствуйте, chili1, Вы писали:

C>В чем дело? Как это лечиться?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.