anonymous@RULINUX.NET~# Last login: 2024-03-29 03:25:11
Регистрация Вход Новости | Разметка | Пользователи | Галерея | Форум | Статьи | Неподтвержденное | Трекер | Правила форума | F.A.Q. | Ссылки | Поиск
[#] [Добавить метку] [Редактировать]
Скрыть

[C] Как справиться с float?

Дано:

c

#include <stdio.h>

int main (void)
{
        float x = 319.870806;
        float y = 207.611958;

        printf("%f %f\n", x, y);

        return 0;
}      
 


На выходе имеем:

text

>./a.out
319.870819 207.611954
 


Обратите внимание на последние цифры: было ...806, стало ...819; было ... 958, стало ...954. Какого, простите, №%#$?!! Как с таким поведением бороться?

anonymous(*) (2016-06-30 18:35:04)
Отредактировано vilfred по причине "не указана"

[Ответить на это сообщение]
[#] [Добавить метку] [Редактировать] Ответ на: [C] Как справиться с float? от anonymous 2016-06-30 18:35:04
avatar
Скрыть

Re:[C] Как справиться с float?

Хмм, непростой случай, надо отметить. Тут такое дело - если в программе слово "float" заменить словом "double", то на какое-то время тебя попустит. Но это скользкий путь, ведь потом ты придёшь снова за новой дозой и на этот раз знаков в твоих числах уже будет значительно больше. Раз и навсегда избавиться от твоей проблемы помогут только очень тяжёлые вещества, обычно прописываемые в подобной ситуации.

anonymous(*)(2016-06-30 19:03:54)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-06-30 19:03:54
avatar
Скрыть

Re:[C] Как справиться с float?

Мне казалось, что раз диапазон флоата заявлен как 1.175494351 × 10−38...3.4028234 × 1038, то число с 6-ю знаками после запятой легко в него поместяться. Если это не так, зачем вводить людей в заблуждения такими гиганскими цифрами?

anonymous(*)(2016-06-30 19:25:49)
Отредактировано anonymous по причине "не указана"
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-06-30 19:25:49
avatar
Скрыть

Re:[C] Как справиться с float?

А там не важно сколько знаков после запятой, важно сколько знаков в числе всего (исключая любые ведущие нули, даже если они после точки). Насколько я понимаю это, float примерно до седьмого знака должен соответствовать исходному числу (1.19e-07).

anonymous(*)(2016-06-30 20:25:49)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-06-30 20:25:49
avatar
Скрыть

Re:[C] Как справиться с float?

фигассе, а потом самолеты падают ....

vilfred(*)(2016-06-30 21:14:50)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от vilfred 2016-06-30 21:14:50
avatar
Скрыть

Re:[C] Как справиться с float?

c


#include <stdio.h>

int main (void)
{
        float x = 10000319.870806;
        float y = 10000207.611958;

        printf("%f %f\n", x, y);

        return 0;
}


[vilfred@localhost ~]$ cc y.c
[vilfred@localhost ~]$ ./a.out
10000320.000000 10000208.000000
[vilfred@localhost ~]$ ^C
[vilfred@localhost ~]$
[vilfred@localhost ~]$ cc -v
Используются внутренние спецификации.
COLLECT_GCC=/usr/bin/cc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/5.3.1/lto-wrapper
Целевая архитектура: x86_64-redhat-linux
Параметры конфигурации: ../configure --enable-bootstrap --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-plugin --enable-initfini-array --disable-libgcj --with-isl --enable-libmpx --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Модель многопоточности: posix
gcc версия 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC)
[vilfred@localhost ~]$

 


чо за бред

vilfred(*)(2016-06-30 21:18:22)
Отредактировано vilfred по причине "не указана"
Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от vilfred 2016-06-30 21:18:22
avatar
Скрыть

Re:[C] Как справиться с float?

хотя тут наверное преобразование типов происходит в принтфе из флота в инт с укругленем

vilfred(*)(2016-06-30 21:28:34)

Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от vilfred 2016-06-30 21:18:22
avatar
Скрыть

Re:[C] Как справиться с float?

Семь знаков передано без искажений?

anonymous(*)(2016-06-30 21:34:06)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-06-30 21:34:06
avatar
Скрыть

Re:[C] Как справиться с float?

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

vilfred(*)(2016-06-30 21:35:22)
Отредактировано vilfred по причине "не указана"
Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от vilfred 2016-06-30 21:35:22
avatar
Скрыть

Re:[C] Как справиться с float?

Кстати, нашёл минимальную разницу между 10000319 и 10000320:

c

#include <stdio.h>

int main (void)
{
        float a = 10000319.499999999068677425384521484375;
        float b = 10000319.499999999068677425384521484374;
        printf("%f %f\n", a, b);

        return 0;
}
 
text

10000320.000000 10000319.000000
 

anonymous(*)(2016-06-30 21:54:28)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от vilfred 2016-06-30 21:28:34
avatar
Скрыть

Re:[C] Как справиться с float?

> тут наверное преобразование типов происходит в принтфе из флота в инт с укругленем

Укруглень там своеобразный:

c

#include <stdio.h>

int main (void)
{
        printf("%.33f\n", 1.0/10.0); // double is used by default
        float n=1.0/10.0;
        printf("%.33f\n", n);
        double m=1.0/10.0;
        printf("%.33f\n", m);

        return 0;
}
 
text

0.100000000000000005551115123125783
0.100000001490116119384765625000000
0.100000000000000005551115123125783
 

anonymous(*)(2016-06-30 22:01:07)
Отредактировано anonymous по причине добавил явный дабл
[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-06-30 22:01:07
avatar
Скрыть

Re:[C] Как справиться с float?

Вот за такие фокусы я и ненавижу все эти флоаты с даблами. Даже банально сравнить два числа нельзя, хотя везде 0,1.

anonymous(*)(2016-07-01 11:29:07)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-07-01 11:29:07
avatar
Скрыть

Re:[C] Как справиться с float?

Да ладно, банально подключаешь заголовочный файл math.h и банально пользуешься функцией isgreater()... Хотя не уверен, что она сравнивает с учётом Эпсилона (если числа различаются не больше чем на эпсилон, то они должны считаться равными ИМХО).

anonymous(*)(2016-07-01 14:45:35)

[#] [Добавить метку] [Редактировать] Ответ на: Re:[C] Как справиться с float? от anonymous 2016-07-01 14:45:35
avatar
Скрыть

Re:[C] Как справиться с float?

Мне нужно isequal(), isgreater() и так можно простым сравнением понять, тем более это просто макросы:

c

#  define isgreater(x, y) \
  (__extension__                                                              \
   ({ __typeof__(x) __x = (x); __typeof__(y) __y = (y);                       \
      !isunordered (__x, __y) && __x > __y; }))

 

anonymous(*)(2016-07-01 15:48:53)

Этот тред читают 1 пользователь:
Анонимных: 1
Зарегистрированных: 0




(c) 2010-2020 LOR-NG Developers Group
Powered by TimeMachine

Valid HTML 4.01 Transitional Правильный CSS!