точность с плавающей запятой дает неправильный вывод. помогите пожалуйста обойти такие ошибки

Итак, у меня проблема с переменными с плавающей запятой. может кто-нибудь объяснить? код указан ниже...

#include<stdio.h>

void main() {
    float b=3.6;
    if(b==3.6)
    {
        printf("one");
    }
    if(b<=3.6)
    {
        printf("two");
    }
    if(b>=3.6)
    {
        printf("three");
    }
    else printf("four");
}

Теперь почему вывод "два" и "четыре"? и как мне избежать таких вещей в pprograms?


person Sam    schedule 17.05.2014    source источник
comment
См. blog.frama-c.com /index.php?post/2011/11/08/Опрос с плавающей запятой   -  person Pascal Cuoq    schedule 17.05.2014
comment
возможный дубликат сравнения с плавающей запятой   -  person Pascal Cuoq    schedule 17.05.2014
comment
здесь уже много дубликатов о точности с плавающей запятой   -  person phuclv    schedule 17.05.2014
comment
кроме того, избегайте float без необходимости, скорее всего, в хранилище, обычные временные вычисления должны вместо этого использовать double   -  person phuclv    schedule 17.05.2014


Ответы (1)


Вы сравниваете floats с doubles. Попробуйте сравнить их с 3.6f вместо 3.6

person Jcl    schedule 17.05.2014
comment
по умолчанию при сравнении принимается 3,6 как двойное? - person Sam; 17.05.2014
comment
Вы можете проверить это: В чем смысл буквы L, Суффиксы U и f в числовых литералах? - person Jcl; 17.05.2014
comment
И отвечая на ваш комментарий... да, каждый литерал без суффикса с десятичными знаками воспринимается как double, поэтому на самом деле он продвигает b до double и затем выполняет сравнение - person Jcl; 17.05.2014