游戏开发论坛

 找回密码
 立即注册
搜索
查看: 5090|回复: 7

sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf(多

[复制链接]

11

主题

23

帖子

23

积分

注册会员

Rank: 2

积分
23
发表于 2005-11-8 00:34:00 | 显示全部楼层 |阅读模式
在vc++.net的MSDN的帮助中,说的很明确的,sqrt函数能根据输入参数的类型重载。

double sqrt( double );

float    sqrt( float );

既然这个函数有这样的重载,为什么还有一个sqrtf 函数?不是sqrt()函数就有float类型的重载了吗?

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2005-11-8 06:00:00 | 显示全部楼层

Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

是为了和c语言兼容?

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-11-8 09:09:00 | 显示全部楼层

Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

啊!!!!sqrt还能自动重载float类型吗?我一直都是(float)sqrt的。

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2005-11-8 09:23:00 | 显示全部楼层

Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

Borland版本是重载的,Microsoft版本没有重载。

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2005-11-8 11:07:00 | 显示全部楼层

Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

对了,数学函数类中常常用sqrt把一个向量单位化,我一直用强制转换(float)sqrt,不知道

sqrtf快还是(float)sqrt快?哪个更好?

11

主题

162

帖子

189

积分

注册会员

Rank: 2

积分
189
QQ
发表于 2005-11-8 15:56:00 | 显示全部楼层

Re: Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqr

最快的方法是用汇编语言

// fast trig routine using inline assembly
float
sqrtf (float x)
{
  if (x < 0.0F )
    {
      errno = EDOM;
      return __QNANF;
    }
  else
    {
      float res;
      asm ("fsqrt" : "=t" (res) : "0" (x));
      return res;
    }
}

这个是 gcc 的,如果用的是一些 Windows 下的私有编译器的话要重写一下

11

主题

162

帖子

189

积分

注册会员

Rank: 2

积分
189
QQ
发表于 2005-11-8 15:59:00 | 显示全部楼层

Re:sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

还有, 如果想求根号 f 分之一的话:

// faster method to calculate 1.0/sqrt(f)
inline float InvSqrt(float f)
{
   float half = 0.5f * f;

   long lBits = *(long *)&f; // evil floating point bit level hacking
   lBits = 0x5f3759df - (lBits >> 1); // WTF?
   f = *(float *)&lBits;
   f *= 1.5f - half * f * f; // 1st iteration
//   f *= 1.5f - half * f * f; // 2nd iteration, this can be removed

   return f;
}

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2005-11-9 10:07:00 | 显示全部楼层

Re: sqrt 函数在C++中不是能重载吗,为什么还出了一个sqrtf

sqrtf的真面目:
inline float sqrtf(float _X)
        {return ((float)sqrt((double)_X)); }
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 13:54

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表