如何判断一个float/double是不是一个有效的值

本文探讨了在游戏程序中遇到的浮点数运算问题,特别是当使用D3DXIntersectTri函数时出现(-1.#INF000)的情况。文章详细介绍了这种特殊浮点数值产生的原因,并提供了一种简单的判断方法。

前几天游戏程序爆在三角形碰撞测试里面.

结果发现是D3DXIntersectTri给我返回了一个float(-1.#INF000).

这个值相信大家都不陌生.

出现这个值的情况一般是除数为0的情况下,即分母为0.

就像这样:

  float a = .7f;

  float b = .0f;

  a /= b;

 

那么如何判断一个float/double值是不是(-1.#INF000)呢?

答案是有的.

 

我们发现当a为-1.#INF000的时候;

a 做任意操作结果都为自身.

 

所以.

很简单,按上面的例子来.

当执行完a /= b; 时a已经=-1.#INF000

那么判断一下:

if (a + 1 == a - 1)

  return true; // 说明是一个无效的数

 

其实结论是 a + 任何数 == a;

 

 

<think>我们正在讨论编程中的数据类型判断。用户想知道如何判断一个数字是double类型还是float类型。 根据引用[1]和[2],我们知道floatdouble的主要区别在于精度和范围:float提供约6-7位有效数字,而double提供约15-16位。另外,它们的存储空间也不同(float通常为4字节,double为8字节)。 在编程中,判断一个数字字面量的类型,通常取决于以下因素: 1. 字面量表示方式:在C/C++等语言中,小数常量默认是double类型。如果要指定为float,需要在后面加'f'或'F'。 例如:3.14 是double类型,3.14f 是float类型。 2. 变量声明:变量被声明为floatdouble类型,那么赋给它的就会被解释为相应的类型。 3. 表达式中的类型提升:在表达式中,float类型通常会被提升为double类型进行计算。 因此,判断一个数字是double还是float,可以从以下几个方面考虑: - 如果是在源代码中,看字面量的后缀(是否有f或F)以及变量的声明类型。 - 在运行时,可以通过编程语言提供的类型信息来检查(例如C++中的typeid,或者使用sizeof运算符判断大小)。 具体方法: 方法1:使用类型信息(如C++) ```cpp #include <iostream> #include <typeinfo> using namespace std; int main() { float f = 3.14f; double d = 3.14; cout << "f is " << (typeid(f) == typeid(float) ? "float" : "not float") << endl; cout << "d is " << (typeid(d) == typeid(double) ? "double" : "not double") << endl; } ``` 方法2:使用sizeof运算符 ```cpp #include <iostream> using namespace std; int main() { float f; double d; cout << "Size of f: " << sizeof(f) << endl; // 通常输出4 cout << "Size of d: " << sizeof(d) << endl; // 通常输出8 } ``` 方法3:在动态类型语言中(如Python),可以使用内置的type函数,但注意Python的float实际上是双精度(相当于C的double)。 总结: 在静态类型语言(如C/C++)中,变量的类型在声明时就已经确定,我们可以通过声明或者字面量后缀来区分。在运行时,我们可以使用类型查询(如typeid)或大小(sizeof)来判断。 在动态类型语言中,通常有内置的类型查询方法,但要注意这些语言可能只有一种浮点类型(如Python的float就是双精度)。 注意:在不同的编程语言中,具体的方法可能不同,但核心思想是检查变量的类型信息或存储大小。 根据引用[3],我们也可以看到C++中基本类型包括floatdouble,它们是不同的类型。 因此,回答用户的问题:判断一个数字在编程中是double还是float类型,主要取决于编程语言和具体的上下文(声明、字面量后缀等)。在静态类型语言中,我们可以通过类型检查工具(如C++的typeid)来区分;在动态类型语言中,通常通过类型查询函数(如Python的type())来获取类型信息,但要注意动态类型语言可能只有一种浮点类型(如Python的float就是双精度,即相当于double)。 如果用户是在编写代码时需要判断,那么需要根据具体的语言特性来处理。</think>在编程中判断一个数字是 `float` 还是 `double` 类型,主要取决于以下关键因素: ### 一、核心判断依据 1. **存储空间大小**(最直接方法) - `float`:通常占用 **4 字节**(32 位) - `double`:通常占用 **8 字节**(64 位) ```cpp sizeof(variable) == 4 // float sizeof(variable) == 8 // double ``` 2. **精度范围**(参考引用[1][2]) - `float`:约 **6-7 位有效数字**(如 `3.141592` 可能被截断) - `double`:约 **15-16 位有效数字**(如 `3.141592653589793` 可完整存储) ```cpp float f = 0.123456789; // 实际存储为 0.1234567(精度损失) double d = 0.123456789; // 完整保留所有位数 ``` 3. **字面后缀**(代码中直接标识) - 无后缀小数默认为 `double`:`3.14` → `double` - 添加 `f/F` 后缀为 `float`:`3.14f` → `float` ```cpp auto x = 3.14; // x 是 double 类型 auto y = 3.14f; // y 是 float 类型 ``` --- ### 二、具体判断方法(以 C/C++ 为例) #### 方法 1:使用 `sizeof` 运算符 ```cpp #include <iostream> int main() { float f_val; double d_val; std::cout << "float size: " << sizeof(f_val) << " bytes\n"; // 输出 4 std::cout << "double size: " << sizeof(d_val) << " bytes\n"; // 输出 8 } ``` #### 方法 2:检查类型信息(C++11 起) ```cpp #include <iostream> #include <type_traits> int main() { float f_val; double d_val; if (std::is_same<decltype(f_val), float>::value) std::cout << "This is a float\n"; if (std::is_same<decltype(d_val), double>::value) std::cout << "This is a double\n"; } ``` #### 方法 3:通过数精度判断 ```cpp #include <iostream> #include <limits> int main() { std::cout << "float 精度位数: " << std::numeric_limits<float>::digits10 << "\n"; // 输出 6 std::cout << "double 精度位数: " << std::numeric_limits<double>::digits10 << "\n"; // 输出 15 } ``` --- ### 三、关键区别总结 | 特性 | `float` | `double` | |--------------|-----------------------------|------------------------------| | **存储空间** | 4 字节 (32 bits) | 8 字节 (64 bits) | | **有效数字** | 约 6-7 位 | 约 15-16 位 [^1] | | **数范围** | $±3.4 \times 10^{38}$ | $±1.7 \times 10^{308}$ | | **默认类型** | 需显式添加 `f` 后缀 | 小数默认类型 | | **适用场景** | 内存敏感场景(如嵌入式)[^2] | 科学计算/高精度需求 [^1] | > ⚠️ **注意**:在 Python 等动态语言中,`float` 实际等价于 C 的 `double`(8 字节),不存在传统 `float` 类型。 --- ### 相关问题 1. 在内存受限的嵌入式系统中,如何权衡使用 `float` 和 `double`? 2. 为什么 C/C++ 中小数字面默认是 `double` 类型而非 `float`? 3. 除了 `float` 和 `double`,编程语言还有哪些浮点数类型(如 `long double`)?[^3] [^1]: 总结:float 类型在精度上提供大约 6 位有效数字,适合一般的浮点数计算。double 类型在精度上提供大约 15 位有效数字,适合需要更高精度的计算和较大数范围。在进行科学计算或需要保持较高精度的情况下,推荐使用 double 类型。 [^2]: 实际开发中,除了个别高精领域,基本上,使用 float 就足够了。 [^3]: 内置的 C++类型分两组:基本类型和复合类型。C++的基本类型包括:`bool`、`char`、`wchar_t`、`char16_t`、`char32_t`、`short`、`int`、`long`、`long long`、`float`、`double`、`long double`。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值