Страница 1 из 2

Куда делась плавающая точка? =(

Добавлено: 2009-03-05 8:33:50
Alex Keda

Код: Выделить всё

srv# cat /var/db/resusage/txt/h1200.all.txt
0 0 0
0 0.9 3
0.5 1.1 3
0 0 0
0.8 1.1 3
0 0 0
0.7 1.1 3
0.1 1.1 3
0 1.1 3
0 1.1 3
0.4 1.1 3
0.6 1.1 3
1.3 1.1 3
0 1.1 3
0.6 1.2 3
1.4 1.1 3
srv#
srv#
srv#
srv# cat /var/db/resusage/txt/h1200.all.txt | awk '{cpu += $1; mem += $2 }; {print cpu, mem}'
0 0
0 0
0 1
0 1
0 2
0 2
0 3
0 4
0 5
0 6
0 7
0 8
1 9
1 10
1 11
2 12
srv#

Re: Куда делать плавающая точка? =(

Добавлено: 2009-03-05 9:02:33
Alex Keda
в русской локали, разделитель - запятая.
закрыто =)

Re: Куда делать плавающая точка? =(

Добавлено: 2009-03-05 12:05:33
paradox
чего ж закрывать
можно продолжить флейм про то какая бсд не полноценная
и что в ядре к примеру нельзя делать операции с плавающей точкой))))

Re: Куда делать плавающая точка? =(

Добавлено: 2009-03-05 12:08:57
Alex Keda
а зачем тебе они в ядре?

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 12:16:45
paradox
ну это вопрос насчет "что такое полноценная ОС" )))
в винде например в ядре можно использовать операции с плавающей точкой
в бсд что то ни вкакую((((
в линухе незнаю.....

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 12:45:32
chd
а для чего в ядре float? чего считать надо интересно..

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 12:49:13
paradox
ну мне float нужен был для драйвера
там уровень сигнала нужно было перевести
в итоге конечно выкрутился и сделал на %
но имхо бред
что нельзя заюзать плавающую точку
это недописаная ОС
если она не умеет этого)

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:10:27
zg

Код: Выделить всё

zg# cat 1.c
#include<stdio.h>

int main(void)
{
  float d = 1.000009;
  printf("%.20f\n", d);
  return 0;
}
zg# cc 1.c -o 1.bin && ./1.bin
1.00000894069671630859
zg#
флоат как флоат, не лучше не хуже :unknown:

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:12:21
paradox
ты модулем сделай)))
что бы в ядре
а не в приложении верхнего уровня

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:20:58
zg
paradox писал(а):ты модулем сделай)))
каким макаром? скажи как, может попробую -))
paradox писал(а):а не в приложении верхнего уровня
странно, вроде операции с плавающей запятой давным давно появились в процах :unknown:

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:23:55
paradox
в процах да))
а что бы реализовать в ядре нужно умеючи переключать контексты многозадачной ОС
и еще что то там....

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

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:36:30
zg

Код: Выделить всё

zg# pwd
/usr/src/sys
zg# grep -ir float net*
net/route.c:     * one more rtentry floating around that is not
net/route.c:             * One more rtentry floating around that is not
netatm/spans/spans_kxdr.h:extern bool_t xdr_float(XDR *, float *);
netinet/sctp_bsd_addr.c:         * make sure we lock any IFA that exists as we float through the
netinet/sctp_structs.h: uint32_t chunks_on_out_queue;   /* total chunks floating around,
zg#
походу spans_kxdr.h как-то умеет с ним работать -)))

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:42:39
paradox
ты забыл uname -a
)))
а то как то в 7 8 я такого не наблюдаю
а про 4 уже незнаю(((
может там чего и работало

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:47:39
zg
paradox писал(а):ты забыл uname -a

Код: Выделить всё

zg# uname -a
FreeBSD zg.test.ru 7.0-RELEASE FreeBSD 7.0-RELEASE #0: Sun Feb 24 19:59:52 UTC 2008     root@logan.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  i386
zg#
у меня даже и дистра четвёрки нету :pardon:

но вообще да, ситуация с float довольно странная, хотя заметил, что некоторые абстрагируют, но это костыль

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 13:51:40
paradox
в RELENG_7
почикали
netatm/spans/spans_kxdr.h:extern bool_t xdr_float(XDR *, float *);
уже нету

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 14:11:49
zg
нда... чё ещё заметил - константы с плавающей запятой есть, но в модулях они не используются
paradox писал(а):уже нету
угу, покоцали :bn: что-то тут не чисто :cz2:

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 16:15:51
MAK
Тоже удивился - и правда нетуть

Код: Выделить всё

#include <sys/param.h>
#include <sys/module.h>
#include <sys/kernel.h>
#include <sys/systm.h>

static int event_handler(struct module *module, int event, void *arg)
{
    int e = 0;
    switch (event)
    {
        case MOD_LOAD:
            printf("hello: loaded\n");
            float d = 1.000009;
            printf("%.20f\n", d);
            break;
        case MOD_UNLOAD:
            printf("hello: unloaded\n");
            break;
        default:
            e = EOPNOTSUPP;
            break;
    }
    return(e);
}

static moduledata_t hello_conf = {
    "hello",
    event_handler,
    NULL
};

DECLARE_MODULE(hello, hello_conf, SI_SUB_DRIVERS, SI_ORDER_MIDDLE);

Код: Выделить всё

Mar  5 16:10:31 makbook kernel: hello: loaded
Mar  5 16:10:31 makbook kernel: %.20f

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 16:25:32
paradox
ты не туда смотрел
ты попробуй поделить числа %))
еще и приводя к типу
оно и компилять незахочет

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 16:26:03
MAK
Во че нашел
http://www.onlamp.com/pub/a/bsd/2008/02 ... tml?page=3
For performance reasons, we don't use any floating point arithmetic in the kernel.

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 16:31:19
chd
ну контексты переключаются и так... иначе не было бы флоату в узерспайс.
тут я думаю нормальная схема работы должна быть между ядром, девайсом, и консумером.
по идее ядро не должно выполнять лишних действий, а просто уведомить/передать консумеру сигнал о наличие/данные.
обработка данных в ядре слишком дорого обойдется всей системе. я так думаю.

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 16:38:12
paradox
ну как я помню
там состояние FPU нужно сохранять и восстанавливать
этот контекст имел ввиду
давно вообщем было когда учили...
но факт)))
в винде пашет на ура
и как то не сильно влияет на производительности
а никсах нет
и толку
8)

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 17:06:37
chd
ну так оно и сохраняется и прочее все такое :)

а я то говорю что ета бэд дизайн в ядре обрабатывать данные не ядра.

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 17:11:42
Гость
хмм, а это забытый кусок?

Код: Выделить всё

> grep -r '^[[:space:]]*float' /sys/
/sys/sys/acct.h:  float       ac_utime;             /* user time */
/sys/sys/acct.h:  float       ac_stime;             /* system time */
/sys/sys/acct.h:  float       ac_etime;             /* elapsed time */
/sys/sys/acct.h:  float       ac_mem;               /* average memory usage */
/sys/sys/acct.h:  float       ac_io;                /* count of IO blocks */
/sys/dev/drm/radeon_drm.h:        float f[5];

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 17:34:36
paradox
>chd
из того что я помню
для fpu там чуть ли не отдальное сотояние задачи
что бы в случае чего
если на каком то месте кода происходят операции с плавающей точкой
то помимо сохранение и переключение контекста задачи
нужно еще и смотреть происходят ли в этом констексте операции с плавающей точкой
и делать еще кучу сложных телодвижений

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

Re: Куда делась плавающая точка? =(

Добавлено: 2009-03-05 19:02:03
zg
Гость писал(а):хмм, а это забытый кусок?
нет, просто есть заглушка

Код: Выделить всё

#ifdef _KERNEL
#define float uint32_t
#endif