工程家园's Archiver

天在下雨 发表于 2005-5-14 20:02

回复:考验大家的算法

/***********************************************************
**引用:
很简单,用C语言编写一个函数,实现四舍五入的功能!要求结构最简单!
function(float a){
int b

return b;
}

大家补充完整吧

[ Last edited by 紫色流星 on 2005-4-10 at 13:13 ]
************************************************************/
//本函数实现对一个正的float型数取四舍五入
//经过适当的完善可以对负的float型数去四舍五入
unsigned long function(float a)
{
           a+=0.5;
           return (unsigned long)a;
}

//望各位高手赐教!

紫色流星 发表于 2005-5-16 11:27

呵呵~~不错!你是第一个做出来的!

天在下雨 发表于 2005-5-16 22:22

呵呵
以前曾经做过

紫色流星 发表于 2005-5-17 14:43

[quote]Originally posted by [i]天在下雨[/i] at 2005-5-16 22:22:
呵呵
以前曾经做过 [/quote]
我以前考试过很多人,但是没有人能做出来~:(

Webmaster 发表于 2005-5-17 15:39

//我改了一下,是不是对负数可以四舍五入了。
unsigned long function(float a)
{
           return (unsigned long)(a>0?a+0.5:a-0.5);
}

Webmaster 发表于 2005-5-17 16:27

///好象用有符号了。.
long Function(float a)
{
    return (long)(a>0?a+0.5:a-0.5);
}

Webmaster 发表于 2005-5-17 17:25

要不要考虑溢出?

天在下雨 发表于 2005-5-18 18:04

应该是要考虑溢出问题的
因为float型表示的数的范围比long型大的多了
这里应该是要假定输入的float型数在long型的范围之内

天在下雨 发表于 2005-5-18 18:57

这里还存在一个问题,就是应该考虑实型数有效数字
int型:16位 表示范围:-32768~32765
unsigned int型:16位 表示范围:0~65535
long型:32位 表示范围:-2147483648~2147483647
unsigned long型:32位 表示范围:0~4294967295
float型:32位 表示范围:-3.402823E38到3.402823E38 (7个有效数字)
double型:64位 表示范围:-1.79E308到1.79E308 (16个有效数字)
这里的E表示以10位底的N次幂
这样当float型变量表示的数小于-1 000 000或大于1 000 000时(即整数部分有7位)就没有小数部分了。也就是说当float型变量表示的范围虽然很大,但是当其表示的数很大时,误差也大了,可能就根本精确不到小数位了,只能保证高7位(10进制)是准确的。
double型亦如此,当整数部分达到16位时也没有小数部分了。

所以只有对-999999.9~999999.9范围内的float型数取四舍五入才有意义。
要想对更宽范围内的数取四舍五入那就要自己定义一种数据类型了。

Webmaster 发表于 2005-5-20 10:54

楼上强,仰视一下。

紫色流星 发表于 2005-5-20 15:52

用不着分析的这么透彻吧?

我发这个算法的目的就是为了让大家对自己的算法能做到精益求精~

不是为了发表论文~hoho ~

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.