Чи безпечно порівняння для типу double stack overflow російською

  1. За яких обставин, безпеку порівняння на == стає низькою? Треба змінну помножити, поділити або що, щоб double почав показувати похибка начебто не 0. а 0.00000001. і доводиться застосовувати епсилон, а не просте порівняння.
  2. В налаштуваннях компілятора є опція: Модель обчислень з плаваючий крапкою (точний, строгий, швидкий). На що вона впливає, якщо встановлено "швидкий", то double буде не точно працювати?

заданий 14 Лютого '15 о 9:17

Порівняння на суворе рівність майже ніколи не безпечно. Замість нього слід використовувати fabs (x-y)

Єдиний випадок, коли можна дозволити собі суворе порівняння - це якщо є якась константа, яку ти міг сам привласнити (явно, без обчислень), і з якої порівнюєш для того, щоб дізнатися, чи було перепрісваіванія. І навіть в цьому місці треба бути обережним, тому що відомі випадки, коли завдяки оптимізації у порівнюваних величин виявляється різний тип, що призводить до різної точності і нерівності.

Ще все обчислення з цілими числами до 2 53 точні. Це використовується мовами з єдиним числовим типом (наприклад js). Однак, якщо ти впевнений, що значення ціле, то навіщо взагалі використовувати double. Краще взяти 64-бітний цілий тип.

Якщо ви хочете порівняти два double. найкраще використовувати таке порівняння (після знака <вы указываете до какого знака после запятой вас интересует сравнение):

Якщо if виконався - два ваших double рівні.

відповідь дан 17 Лютого о 9:35

Чим ця відповідь відрізняється від інших? - Qwertiy ♦ 17 Лютого о 10:52

@Qwertiy Я думаю, що новачкам цей спосіб буде зрозуміліше, він не використовує ніяких функцій - Олексій 17 Лютого о 11:07

Так мій теж не використовує :) - Qwertiy ♦ 17 Лютого о 12:43

Не знаю, чи буде корисний для Вас моя порада. При зчитуванні з файлу точок деякій залежності - наведених з деяким кроком (0.1) по абсциссе або з випадковим кроком, я, звичайно, без шкоди для точності намагаюся абсциси виразити за допомогою двійкових дробів (знаменник = 2 ^ n). Наприклад, 0.1 =

51/512. А потім, за допомогою інтерполяції зраджую абсциси і ординати. Тоді порівняння ==, <и> стають коректними. Багато часу інтерполяція даних не займає і на точність практично не впливає.

відповідь даний 14 Лютого '15 об 11:41

Схожі статті