Thread: explicitly casting return value of avg() to float4

explicitly casting return value of avg() to float4

From
Jon Lapham
Date:
Is the preferred way to return the average of ::float4 values to
explicitly cast the returned value of avg() to ::float4?

If so, how do people deal with this in end user apps?  Do you check to
see whether the column is ::float8 or ::float4 and then use a different
SQL statement?  Ugh, I hope not.

main_v0_8=# select version();
                            version
-------------------------------------------------------------
  PostgreSQL 7.2.1 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)

main_v0_8=# select avg(0.01::float4);
          avg
---------------------
  0.00999999977648258
(1 row)

main_v0_8=# select avg(0.01::float4)::float4;
  avg
------
  0.01
(1 row)


--

-**-*-*---*-*---*-*---*-----*-*-----*---*-*---*-----*-----*-*-----*---
  Jon Lapham
  Extracta Moléculas Naturais, Rio de Janeiro, Brasil
  email: lapham@extracta.com.br      web: http://www.extracta.com.br/
***-*--*----*-------*------------*--------------------*---------------


Re: explicitly casting return value of avg() to float4

From
Tom Lane
Date:
Jon Lapham <lapham@extracta.com.br> writes:
> Is the preferred way to return the average of ::float4 values to
> explicitly cast the returned value of avg() to ::float4?

Yeah, if you want it to float4 precision.  The internal arithmetic
is always done in float8 to try to minimize cancellation problems.

> main_v0_8=# select avg(0.01::float4);
>           avg
> ---------------------
>   0.00999999977648258
> (1 row)

This isn't really any different from

regression=# select 0.01::float4::float8;
       float8
---------------------
 0.00999999977648258
(1 row)


            regards, tom lane

Re: explicitly casting return value of avg() to float4

From
Jon Lapham
Date:
Tom Lane wrote:
> [snip]
> This isn't really any different from
>
> regression=# select 0.01::float4::float8;
>        float8
> ---------------------
>  0.00999999977648258
> (1 row)
> [snip]

True enough.

So, I guess my applications will have to first determine what the column
precision is, an then use the appropriate ::float4 cast if the column is
a float4 column.  This stinks... but I do understand why it is the way
it is.

Is there an SQL-ic way to determine the column type (ie: float4) of a
column?

Thanks,
-Jon

--

-**-*-*---*-*---*-*---*-----*-*-----*---*-*---*-----*-----*-*-----*---
  Jon Lapham
  Extracta Moléculas Naturais, Rio de Janeiro, Brasil
  email: lapham@extracta.com.br      web: http://www.extracta.com.br/
***-*--*----*-------*------------*--------------------*---------------