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

View: New views
6 Messages — Rating Filter:   Alert me  

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

by mitrofanzzz :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Уважаемое сообщество разрешите вопрос.
Есть такой вот КОД!
$ 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
 Подскажите пожалуйста, что я делаю не так?

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



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

by BSW-2 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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



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

by Ilya A. Kovalenko :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

>         float radius;
>         scanf ("%f", &radius);
>         printf("%5.5f\n",radius);

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

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

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



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

by Alexander Yurchenko-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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



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

by Evgeniy Dmitriev :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

Можете порекомендовать "умные книжки" по теме?

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

by Pavel Labushev-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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

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