Newsgroup: it.comp.lang.c
Titolo: Ciò che rende un unomo una bestia :GNU

Dopo aver perso mezza giornata alla ricerca di un bug in un  mio 
programma ho scoperto questo:
Se noi scrivamo un programma
#include <stdio.h>
#include <stdlib.h>
int mian(void)
{
	double x=-0.05;
	printf("\n%f\n",abs(x));
	return(0);
}
Il nostro poderoso Gnu compila tutto e fa girare anche il programma ma 
sognatevi di ottenere il risultato 0.05!!!!!Infatti dopo lunghe rotture 
mi sono letto la guida di abs() e ho scoperto che supporta solo gli 
int!!!
Fantastico !!!Un bel bug ma come è possibile che compili senza 
errore???Per passare da un double a un int non si usa il casting???
GRAZIE
<<SAX>>

errore???Per passare da un double a un int non si usa il casting???
Magari se includessi math.h...
-- 
Marco Barisione (ICQ 84277092)

> Magari se includessi math.h...
L'ho fatto ma non lo ho messo quando ho trascritto il programma se non ci 
credi prova
//
//	abstest.c
//
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int mian(void)
{
	double x=-0.05;
	printf("\n%f\n",abs(x));
	return(0);
}
lo compili con 
gcc abstest.c -o abstest && ./abstest
GRAZIE
<<SAX>>

credi prova
Io ci credo, visto che abs vuole un int, e non un float o double...
ABS(3)              Linux Programmer's Manual              ABS(3)
NAME
       abs,  labs, llabs, imaxabs - compute the absolute value of
       an integer.
SYNOPSIS
       #include <stdlib.h>
       int abs(int j);
       long int labs(long int j);
       long long int llabs(long long int j);
       #include <inttypes.h>
       intmax_t imaxabs(intmax_t j);
DESCRIPTION
       The abs() function computes  the  absolute  value  of  the
       integer  argument  j.   The  labs(), llabs() and imaxabs()
       functions compute the absolute value of the argument j  of
       the appropriate integer type for the function.
RETURN VALUE
       Returns the absolute value of the integer argument, of the
       appropriate integer type for the function.
-- 
+---- | Un OS per domarli, Un OS per trovarli,             |  -o)
+---+ | Un OS per ghermirli e nel buio incatenarli         |  /\\
 O  | | Nella terra di Redmond, ove l'ombra cupa scende... | _\_V
                    raffaele punto salmaso presso libero punto it

c'è sempre la funzione fabs

 errore???Per passare da un double a un int non si usa il casting???
La conversione e` automatica, il compilatore effettua un troncamento. Il
compilatore si  comporta correttamente, come descritto  nel punto primo,
paragrafo 6.3.1.4 dello standard:
6.3.1.4 Real floating and integer 
1 When a finite  value of real floating type is  converted to an integer
type other than _Bool, the fractional part is discarded (i.e., the value
is truncated toward  zero). If the value of the integral  part cannot be
represented by the integer type, the behavior is undefined.
Il compilatore  accetta tranquillamente anche un'assegnazione  di questo
tipo:
double pi = 3.14;
int i = pi;
Per lavorare  con i numeri in  virgola mobile il C  mette a disposizione
queste 3 funzioni (definite in math.h):
double fabs(double x);
float fabsf(float x);
long double fabsl(long double x);
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Non sempre quello che viene dopo e` progresso.
Alessandro Manzoni

 <<SAX>>
 
invece di incazzarti e dare dei deficienti a quelli della GNU prima 
rifletti :
1) - abs vuole un int e ritorna un int 
2) - in c il troncamento di un float in un int non e' un errore
3) - la prossima volta usa -Wall per abilitare i warning in compilazione 
bye bye 
-- 
#eno