c: modf (xc8 microchip)

Jan Waclawek konfera na efton.sk
Úterý Červenec 11 13:25:44 CEST 2023


Hm, tak toto je zapeklita zalezitost, v podstate sa jedna o defekt
prekladaca (cim je mysleny kompilator aj s kniznicami).

Podla manualu:

When building for C99, the double type is the same size and format as the
float type, and is a 32-bit
representation.

A tak si sudruhovia tym 

>#define		modf(x,y)	modff(x,y)

zjednodusili pracu; avsak ta kontrola typu zostala, lebo v C90 mode s
nejakymi prepinacmi mozu byt float a double rozdielne.

(Mimochodom, 5.3.4  Floating-Point Data Types hovori:

The 32-bit floating-point type supports “relaxed” semantics when compared
to the full IEEE implementation, which
means the following rules are observed.

a nasleduje zoznam vlastnosti, ktorym si tiez zjednodusili robotu. Teda
format cisiel je IEEE754, ale vypocty v niektorych "okrajovych" pripadoch
nie. Pre "bezne" pouzitie to nemusi vadit, ale treba to mat na pamati.)


Ako pisete, spravne riesenie je to 
>#define		modf(x,y)	modff(x,y)
z <math.h> vyhodit (resp. prepisat), aj ked sa mi prieci modifikovat
sucasti prekladaca (subor math.h). Akurat tipujem, ze v skutocnosti
implementacia modf(x, y) v kniznici chyba, takze potom hodi chybu linker
(hodi ju?).

Ina moznost by bola explicitne pretypovanie:

#define		modf(x, y)	modff(x, (float*)y)

Dalsia moznost je nepouzit double priamo pri volani toho modf, resp. to
pretypovanie urobit tam:
    f_val = modf(TeplotyCidel[CisloCidla].Teplota_Db, (float*)&i_val);
prip. rovno
    f_val = modff((float)TeplotyCidel[CisloCidla].Teplota_Db,
(float*)&i_val);


No a potom sa da ten warning ignorovat, prip. ak to prekladac umoznuje,
explicitne potlacit:

#pragma warning push
#pragma warning disable [cislo warningu]
    f_val = modf(TeplotyCidel[CisloCidla].Teplota_Db, &i_val);
#pragma warning pop

wek


----- Original Message ---------------

Subject: RE: c:  modf (xc8 microchip)
   From: "Miroslav Draxal" <evik na volny.cz>
   Date: Tue, 11 Jul 2023 12:26:07 +0200
     To: "'HW-news'" <hw-list na list.hw.cz>

>#define		lroundl(x)	lroundf(x)
>
>double      		modf(double, double *);
>float       		modff(float, float *);
>long double 		modfl(long double, long double *);
>#define		modf(x,y)	modff(x,y)
>#define		modfl(x,y)	modff(x,y)
>
>double      		nan(const char *);
>
>Je přímo z originál math.h
>
>C standart 		C99
>
>linker
> Size of double 	32bit
> Size of float	32bit
>
>../../../Knihovny/PIC/DS18B20/DS18B20.c:308:55: warning: incompatible
>pointer types passing 'double *' to parameter of type 'float *'
>[-Wincompatible-pointer-types]
>    f_val = modf(TeplotyCidel[CisloCidla].Teplota_Db, &i_val);
>                                                      ^~~~~~
>C:\Program Files\Microchip\xc8\v2.41\pic\include\c99\math.h:290:28: note:
>expanded from macro 'modf'
>#define         modf(x,y)       modff(x,y)
>                                        ^
>C:\Program Files\Microchip\xc8\v2.41\pic\include\c99\math.h:288:33: note:
>passing argument to parameter here
>float       modff(float, float *);
>                                ^
>
>V podstatě se to děje od verze XC8 v2.00
>Míra
>
>
>
>-----Original Message-----
>From: Hw-list [mailto:hw-list-bounces na list.hw.cz] On Behalf Of Jan Waclawek
>Sent: Tuesday, July 11, 2023 11:34 AM
>To: HW-news
>Subject: Re: c: modf (xc8 microchip)
>
>>#define                modf(x,y)            modff(x,y)
>
>Hm.
>
>Pozrel som manual, a tam sa nic podobne nespomina (a podla vsetkeho ste
>zobrali ten priklad priamo z toho manualu).
>
>Nepouzivate nahodou  -fshort-double ?
>
>wek
>
>
>----- Original Message ---------------
>
>Subject: c:  modf (xc8 microchip)
>   From: "Miroslav Draxal" <evik na volny.cz>
>   Date: Tue, 11 Jul 2023 11:12:50 +0200
>     To: "'HW-news'" <hw-list na list.hw.cz>
>
>>Dobrý den,
>>
>>Poprosím o radu.
>>
>> 
>>
>>V math.h překladače xc8(2.41) jsou definice.
>>
>> 
>>
>>double                 modf(double, double *);
>>
>>float                     modff(float, float *);
>>
>>long double        modfl(long double, long double *);
>>
>>#define                modf(x,y)            modff(x,y)
>>
>>#define                modfl(x,y)           modff(x,y)
>>
>> 
>>
>>Pokud 
>>
>>  double x, y, n;
>>
>>  x = 0.707;
>>
>>  y = modf(x, &n);
>>
>> 
>>
>>Tak to na mě řve


Další informace o konferenci Hw-list