Программирование на СИ акт второй

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

Программирование на СИ акт второй

mitrofanzzz

Уважаемое сообщество разрешите вопрос.
Есть такой вот КОД!
$ cat zd46.c
#include<stdio.h>

main()
{
        float radius;
        scanf ("%f", &radius);
        printf("%5.5f\n",radius);
        return(0);
}

Все просто и незамысловато. Но я так и не понимаю такого поведения:
$ zd46.out
123.321
123.32100
$ zd46.out
12345ю54321
12345.00000
$ zd46.out
12345.54321
12345.54297
$ zd46.out
12345.54321
12345.54297
$ zd46.out
12345.543
12345.54297
 Подскажите пожалуйста, что я делаю не так?

--
С уважением Сохин Никита Александрович...


Reply | Threaded
Open this post in threaded view
|

Re: Программирование на СИ акт второй

BSW-2
mitrofanzzz пишет:
>
> Все просто и незамысловато. Но я так и не понимаю такого поведения:
..
> Подскажите пожалуйста, что я делаю не так?
А что конкретно не так? Не устраивают пять знаков после запятой, или
вызывает недоумение "искажение" данных? Ну так это штатная фича. Ни один
из форматов с плавающей точкой не способен представить
_любое_произвольное_ число с абсолютной точностью. Попробуйте
использовать не float, а double, возможно полегчает.


Reply | Threaded
Open this post in threaded view
|

Re: Программирование на СИ акт второй

Ilya A. Kovalenko
In reply to this post by mitrofanzzz
>         float radius;
>         scanf ("%f", &radius);
>         printf("%5.5f\n",radius);

>  Подскажите пожалуйста, что я делаю не так?

я бы не использовал *scanf()-функции ...
*предпочитаю более предсказуемые strtod() и strtol()*

кроме того, если мне не изменяет память, при выводе print() может
делать округление, проверьте


Reply | Threaded
Open this post in threaded view
|

Re: Программирование на СИ акт второй

Alexander Yurchenko-3
In reply to this post by mitrofanzzz
On Mon, Nov 09, 2009 at 07:11:42PM +0300, mitrofanzzz wrote:

>
> Уважаемое сообщество разрешите вопрос.
> Есть такой вот КОД!
> $ cat zd46.c
> #include<stdio.h>
>
> main()
> {
>        float radius;
>        scanf ("%f", &radius);
>        printf("%5.5f\n",radius);
>        return(0);
> }
>
> Все просто и незамысловато. Но я так и не понимаю такого поведения:
> $ zd46.out
> 123.321
> 123.32100

Согласно формату два знака в конце добиты нулями.

> $ zd46.out
> 12345ю54321
> 12345.00000

scanf наткнулся на первую нецифру и остановился.

> $ zd46.out
> 12345.54321
> 12345.54297

Особенности формата хранения чисел с плавающей запятой не позволяют
точно передать все числа.

> $ zd46.out
> 12345.54321
> 12345.54297

См. выше.

> $ zd46.out
> 12345.543
> 12345.54297

См. выше.

> Подскажите пожалуйста, что я делаю не так?

Да вроде все так делаете. Ну разве что книжек умных мало читаете.

>
> --
> С уважением Сохин Никита Александрович...
>

--
Alexander Yurchenko


Reply | Threaded
Open this post in threaded view
|

Re: Программирование на СИ акт второй

Evgeniy Dmitriev
> Да вроде все так делаете. Ну разве что книжек умных мало читаете.

Можете порекомендовать "умные книжки" по теме?
Reply | Threaded
Open this post in threaded view
|

Re: Программирование на СИ акт второй

Pavel Labushev-3
Evgeniy Dmitriev пишет:
>> Да вроде все так делаете. Ну разве что книжек умных мало читаете.
>
> Можете порекомендовать "умные книжки" по теме?

В.В. Подбельский, С.С. Фомин - "Программирование на языке Си". В своё
время приятно удивила значительными отличиями от K&R, в лучшую сторону.