|
|
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Привет. я новичок в джава и у меня такая проблема: написал метод: 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 В чем может быть проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 09:29:16 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
hybrid, Код: java 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 09:39:33 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
rsltr, а как его использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 09:49:36 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
я пишу калькулятор, округления делать нельзя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 09:52:15 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Вместо Double используйте BigDecimal Много раз уже обсуждалось и тут и в гугле. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 09:56:29 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
hybrid, можно для начала просто strictfp из объявления метода убрать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 10:55:09 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkhybrid, можно для начала просто strictfp из объявления метода убрать 1. Как тут влияет stractfp? 2. Это убрать можно, но это не первое. Первое - разобраться с тем, как представляются десятичные числа (double) в компьютере и какие могут быть с этим проблемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 13:15:13 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Leonidvavp.mkhybrid, можно для начала просто strictfp из объявления метода убрать 1. Как тут влияет stractfp? Как-то так. http://cloud-cuckoo.com.ua/content/java-strictfp-metody Leonidv2. Это убрать можно, но это не первое. Первое - разобраться с тем, как представляются десятичные числа (double) в компьютере и какие могут быть с этим проблемы. По-моему стереть одно слово и перекомпилировать программу значительно быстрее, чем в чём-нибудь разбираться... То, что он разберётся - как это решит его проблему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 15:33:07 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Считает-то он правильно. Неизбежная ошибка возникает при преобразовании 1.2 в двоичный вид. Это как если бы ты пытался 1/3 представить в десятичном виде - все равно будет ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 15:51:51 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mk, Когда обучаешься чем либо, лучше разбираться. И да, sctrictfp здесь не причем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 16:14:11 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Leonidvsctrictfp Для чего он нужен по-вашему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 16:22:18 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 21:22:56 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Или даже так (предидущий не работал бы с отрицатеьными величинами) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 23:10:34 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mk, Чем это лучше String.format("%.70f", 1.02)? И да, вы показываете, что не понимаете обработку вещественных чисел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2012, 23:44:12 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Leonidvavp.mk, Чем это лучше String.format("%.70f", 1.02)? К сожалению они делают разные вещи, их несколько сложно сравнивать =) LeonidvИ да, вы показываете, что не понимаете обработку вещественных чисел. Где это я так прокололся, что вы разгадали мой секрет?) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 10:43:38 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkLeonidvavp.mk, Чем это лучше String.format("%.70f", 1.02)? К сожалению они делают разные вещи, их несколько сложно сравнивать =) И что делает ваша функция. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2012, 10:55:15 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Хм.... Прошу прощения за внезапный ап. Код: 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. Double:0.3183098861837907 Float:0.31830987 Double:0.3183098861837907 Float:0.31830987 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 02:16:13 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
mayton, Я не понял вопроса) P.S. Тема у функций одинаковые.. Так должно быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 16:05:58 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Я вот и думаю. Должно или не должно. 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 16:24:40 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
strictfp гарантирует одинаковость результатов на разных (со)процессорах. Смысл гонять такие тесты на одном и том же сопроцессоре одного и того же интела. Вот если у вас под руками Power и ARM - да, интересно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 16:59:44 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
ОК. Я понял. Я просто другой смысл узрел в документации по JVM. ну да ладно. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 17:49:02 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
У меня не получилось смоделировать случай чтобы метод с модификатором 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.09.2013, 20:07:06 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатора. И не должно. У вас там вроде бы нигде большая (или маленькая) экспонента не получается. Поэтому и разницы никакой. Да и не факт, что ваша JVM использует extended expontent value set. Может в VM есть флаг который определяет ограничивать точность всех расчётов или нет? (и по умолчанию он установлен) Точность (количество значимых битов в мантисе) фиксировано и одинаково как для strictfp, так и для не strictfp методов. strictfp может влиять только на диапазон (range) представляемых значений, но не на точность. Читайте JLS 4.2.3, 15.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 09:55:02 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатораstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них. В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет. P.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 15:32:22 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них. В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет. AMD.. (ну наверное это не важно) [offtop] Basil A. SidorovP.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают? Не знаю. Думаю врятли в институтах что-то кроме паинта изучают (сделал такой вывод исходя из того насколько тупые студенты приходят к нам на практику). Я изучаю гидравлику, сопромат, детали машин и всякое такое г.. [offtop] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 18:56:05 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkAMD.. (ну наверное это не важно)8087 делала AMD или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 19:36:14 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovavp.mkУ меня не получилось смоделировать случай чтобы метод с модификатором strictfp считал не так как точно такойже метод без этого модификатораstrictfp может влиять на точность тогда, когда, например, складываются-вычитаются числа, отличающиеся (по порядкам) настолько, что требуется денормализация одного из них. В этом случае у 80-битного формата интела есть запасные разряды, а у 64-битного double - нет. P.S. Я что-то не понимаю - приближённые вычисления уже совсем не изучают? Я по старинке считал что JVM использует FPU если есть. Если нет - эмулирует программно на всяких мобилках и прочих стриральных машинках. Архитектурно FPU состоит из 8 штук 80-битных регистров с которыми он и выполняет операции как стековая машина (LIFO). Насколько я понимаю загрузить в него 32-х битный или 64-х битное число невозможно. Любые числа кастятся в 80 битные. Потом над ними выполняются операции. Результат операции можно извлечь обратно и снова закастить в float или double с отсечением точности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 20:30:42 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2013, 21:25:59 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mk Код: java 1. 2. 3. А с каких пор (строгий) ноль стал на что-то влиять? У 80-битного extended 16 запасных двоичных разрядов, а не ~2000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 16:08:14 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
maytonАрхитектурно FPU состоит ...Почитайте лучше про денормализацию, почему её использует и как это влияет на конечный результат при разной точности промежуточных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 16:10:56 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovmaytonАрхитектурно FPU состоит ...Почитайте лучше про денормализацию, почему её использует и как это влияет на конечный результат при разной точности промежуточных. Я много чего знаю про денормализацию. Из теории проектирования БД. Но у вас очевидно есть другой смысл этого термина. Дайте сссылку на пруф. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 16:13:11 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
maytonЯ много чего знаю про денормализацию. Из теории проектирования БД. Но у вас очевидно есть другой смысл этого терминаСпросите у гугла про IEEE 754 . Если вкратце, то представление вещественных чисел неоднозначно: 1.0e1 и 0.1e2 - одно и то же число. При нормализации "в терминах IEEE 754" порядок выбирается таким образом, чтобы старший бит мантиссы был единичным. Этот "нормализованный бит" не хранится в (бинарном) представлении числа явным образом, что позволяет увеличить точность на один разряд. Если отказаться от денормализации, то в процессе масшабирования, которое необходимо при сложении-вычитании, рано или поздно возникнет ситуация, когда масштабируемое число превратится в ноль. С денормализованными числами мы теряем точность, но получаем запас в несколько порядков на масштабирование. Аналогичным образом, денормализация может потребоваться при делении "достаточного малого" числа на "достаточно большое" и при перемножении "достаточно малых" чисел. Интеловский extended - денормализованный, что, собственно, и позволяет сопроцессору не терять скорость при вычислениях - все затраты по (де)нормализации приходятся на загрузку/сохранение double/float. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 16:37:58 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 17:17:15 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mkКак же всё-таки увидеть разницу, о мудрейший?Использовать числа, содержащие единицы во всех (бинарных) разрядах мантиссы масштабируемого числа. P.S. Возьмите лист бумаги, карандаш или ручку и поскладывайте в столбик. Будет более продуктивно, чем перебирать несколько более 2^52 вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 19:44:11 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
Basil A. Sidorovнесколько более менее 2^52 вариантов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2013, 19:45:02 |
|
||
|
strictfp
|
|||
|---|---|---|---|
|
#18+
avp.mk, Я повторю. strictfp не может влиять на точность вычислений. Не может. Единственное, на что он может влиять - так это на возможность получить какое-то значение вместо NaN/0. Все. Больше значащих бит strictfp дать не может по определению. Мантисса всегда имеет одну и ту же длину. Если я правильно помню, при передаче параметров в/из методов они тоже приводятся к набору чисел со стандартной экспонентой. Так что разницу нужно искать на коде вроде: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. И не факт еще, что разница будет. Она может быть, но ее может и не быть. Т.е. на каких-то архитектурах все вычисления автоматически будут strictfp. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2013, 12:34:28 |
|
||
|
|

start [/forum/topic.php?all=1&fid=59&tid=2128654]: |
0ms |
get settings: |
12ms |
get forum list: |
28ms |
check forum access: |
3ms |
check topic access: |
4ms |
track hit: |
60ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
68ms |
get tp. blocked users: |
2ms |
| others: | 337ms |
| total: | 530ms |

| 0 / 0 |
