Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Проблемка округления в дебилдере 2009. Не отвлекаемся на теорию прибл-х вычислений вообще и в компах в частности. Интересует, влияет ли #define , или конкретно 2009-й дебилдер, или особенности проги, в сочетании с хитрым вычисляемым числом? Ниже я намеренно привожу чуть больший контекст. Есть описания: Код: plaintext 1. 2. 3. Есть 2 варианта кода: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Вопрос в том, почему в рантайм и в отладке Код: plaintext 1. 2. Это видно по итоговому результату nds в пользовательском окне - там тоже округление, но уже в текстовый вид. Казалось бы эквивалентно, но нет, а почему? П.С. Ну да, в битовом виде на лету промежуточный рез-т "5665.455" не смотрел. Ну а само оно = 5665.4549999...9986... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 17:13 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Похоже дибилдер из вас двоих не компилятор.. Компилятор все правильно тебе говорит. Ненужно округлять посреди расчетов. Округление только конечного результата. при представлении для человека. Вообще тип money - 4 знака после запятой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 18:26 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98П.С. Ну да, в битовом виде на лету промежуточный рез-т "5665.455" не смотрел. Ну а само оно = 5665.4549999...9986... после расчетов может оказаться 5665.4550000...0011... и тоже будет правильно. Сравнивай не с 0.5, а с 0.5000000001 или 0.4999999999 не соображу сходу как правильно. А в целом пофиг как округлится при расчете НДС, главное чтобы всегда было однозначно и остальная математика сходилась в рамках документа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 18:40 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98, ну нельзя деньги считать во float/double, ну нельзя. Единственное исключение -- финансовые расчёты, когда точность не нужна до копейки. Есть же в Delphi в VCL decimal какой-то, его и нужно использовать. авторВопрос в том, почему в рантайм и в отладке 1) TO_KOP( funct(i) ) = 5665.45 2) TO_RUB( xx ) /100.0f = 5665.46 Это видно по итоговому результату nds в пользовательском окне - там тоже округление, но уже в текстовый вид. Казалось бы эквивалентно, но нет, а почему? П.С. Ну да, в битовом виде на лету промежуточный рез-т "5665.455" не смотрел. Ну а само оно = 5665.4549999...9986... Потому что даже когда ты в отладчике видишь число, оно уже может быть представлено с погрешностью. Плавающая арифметика в принципе неточная. Она даже внутри в машине, в регистрах, уже неточно может храниться. Бессмысленно что-то проверять на "такой/не такой". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 01:33 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98, пробуй так округлять Код: plaintext 1. 2. и дай полный исходник теста, попробую посмотреть как mingw себя ведет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 05:45 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, знаю твоё неравнодушие к округлениям, об этом я в курсе ещё с больших машин, когда обрабатывал СПРН. Переделывать тогда уж сотню файлов и процы в БД, да и саму БД переводить на копейки. Это не вариант. Вопрос в том, почему дефайн считает не как я думаю, ну или наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 09:40 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
locked, уважаемый, складывать надо в копейках, а не в грошах, иначе столкнётесь с вопросом, почему округлённая сумма не равна сумме округлений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 09:42 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Dima TСравнивай не с 0.5, а с 0.5000000001 или 0.4999999999 не соображу сходу как правильно.согласен, мысль здравая. Это уже я сам 0.5 написал. Только вопрос возник, когда сравнение ещё стояло: X-floor(X) >= ceil(X)-X И вот хоть убей, в дефайне даёт одно, а при разбивке на этапы другое. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 09:49 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
m_Sla и дай полный исходник теста, попробую посмотреть как mingw себя ведет Совсем полный исходник сложно, т.к. вместо моего funct() стоит что-то вроде A->B->at(i)->nds, всё это в цикле, где последнее nds - на самом деле свойство совсем другого класса, и там тоже суммирование, и оно тоже дёргает функцию, к-рая лезет в БД. Попробую слепить отдельно стоящий фрагмент. И конечно же, моё 5665,455 - это не всамоделишнее число, а как мне его кажет отладчик. О! сначала попробую перед прогоном это число руками влепить и посмотрю. Так что попозднее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 10:00 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
И кстати, если кого коробит моё "дебилдер" - это не от того, что сейчас вопрос про округления, и не от того, что вместо функции математического округления он использует т.н. "банковское" округление. Это относится конкретно к пользуемой мною версии 2009, т.к. его редактор! исходников не только не справляется с русскоязычными коментами, но и часто не различает положение курсора в тексте и в своих думах, а также часто и не предсказуемо зависет, а то и попросту курочит исходники, превращая их в нечто бинарное. Но что есть, то есть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 10:14 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
MasterZivПлавающая арифметика в принципе неточная арифметика сама по себе точная и в регистрах значения "точные", беда в том что не всякое вещественное число(десятичная дробь в частности) может быть представлено в IEEE 754 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:10 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98И кстати, если кого коробит моё "дебилдер"2009й действительно совсем кривой был. Либо 2007, либо 2010 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:11 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
ИзопропилMasterZivПлавающая арифметика в принципе неточная арифметика сама по себе точная и в регистрах значения "точные", беда в том что не всякое вещественное число(десятичная дробь в частности) может быть представлено в IEEE 754 нет, арифметика тоже неточная. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:47 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98MasterZiv, знаю твоё неравнодушие к округлениям, об этом я в курсе ещё с больших машин, когда обрабатывал СПРН. Переделывать тогда уж сотню файлов и процы в БД, да и саму БД переводить на копейки. Это не вариант. ты можешь хоть всю жизнь идти к северному полюсу по магнитному компасу, но все равно не дойдешь... exp98Вопрос в том, почему дефайн считает не как я думаю, ну или наоборот. не глядел твои макросы , если не устраивает, используй функции, в чем проблема? шаблонные, если надо. они отлаживаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:54 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98, чтобы понять, что там у тебя, нужен полный код. полный , рабочий код. нужно знать типы данных всех переменных и то, как ты их выводишь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:58 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
MasterZiv, все они double, и методы возвращают double, проверено неоднократно. Когда-то оставались float, ош. сразу вылезали при числах больше 7 цифр. Я выберу время на простой пример, и если воспроизведётся, то запостю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 12:20 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
3 варианта кода, разные результаты Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:03 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
MasterZivнет, арифметика тоже неточная. что значит "неточная"? десятичная - тож окажется "неточной": 10/3 - и приехали ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:39 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp983 варианта кода, разные результаты В MSVC2015 одинаковые Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:44 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
ИМХУ надо так Код: plaintext 1. т.к. (X)-floor(X) в реале 0.5+-погрешность (10^-15) поэтому надо чуть меньше порог. Т.к. дискретность два знака после запятой, то 3х знаков достаточно, т.е. 0.499. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:55 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Везёт же некоторым )) После обеда подумал, что наверное для дефайна промежуточный рез-т вычисляется в длинном буфере. А вообще, конкретно в этом D'Buildere-2009 отладчик обычно показывает правильное округление, но там скорость не важна. С тех пор как столкнулся с "банковским" округлением RoundTo() и SimpleRoundTo() не отпускал вопрос, почему в библиотеку нельзя было поместить нужную функцию. 2-х шаговое округление девяток тоже не прокатит, потуму как заранее неизвестно, так ли д.б. или это всего лишь погрешность вычислений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 15:05 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Ну обсосано же давно, континуум R отображается на конечное пространство, в к-ром и происходят вычисления, а ещё 5 и 2 взаимно простые. Не только Изопропилбеда в том что не всякое вещественное число(десятичная дробь в частности) может быть представлено в IEEE 754, но и в соотношении операндов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 15:20 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
exp98, проверка на 0.499 чем не понравилась? 19934637 ИМХУ надо именно так проверять, т.к. даже если в данном примере MSVC не дал ошибки, то это не значит что ее никогда не случится на других значениях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:34 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
Потому что хвост вытащил - нос увяз(( потому как заранее неизвестно, точное ли оно или с погрешностью вычислений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:42 |
|
||
|
и снова копейки: #define, С++ , Builder 2009 ?
|
|||
|---|---|---|---|
|
#18+
В целом у нас курс примерно на такое Dima T главное чтобы всегда было однозначно и остальная математика сходилась в рамках документа. К сож, встречаются расхождения, пытаемся лечить по мере обнаружения. Несмотря на то, что давно ещё РС начинал с ассемблера на х08-х16, вникать снова желания нет. Если кому интересно, то вот фрагменты из отладки: File1.cpp.25: if(k==1) { //// 1) ответ 5665,45 Код: plaintext 1. Код: plaintext 1. 2. 3. Код: plaintext 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. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. Код: plaintext 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. Код: plaintext 1. 2. 3. Код: plaintext 1. 2. 3. Код: plaintext 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. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 17:07 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39354715&tid=2018316]: |
0ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 17ms |
| total: | 163ms |

| 0 / 0 |
