- 主题:ieee浮点数有这个规律吗
我是遇到了大量浮点数的比较,最大可能G量级,我在想,转换成整数比较会不会快一点?还是说我想多了,其实对cpu来说,这两种比较没有区别?
【 在 Bernstein (Berns) 的大作中提到: 】
: 保证不了,因为浮点数不是全序的
: 需要加一些条件,然后做一些比特位的变换,才能转成整数比较
--
FROM 115.205.65.*
这个应该说“二进制解释/翻译”吧,一般说强制转换是cast,是取整。
【 在 webhost 的大作中提到: 】
: 就是任意两个浮点数Fa、Fb的内存值,强制转换成整数去看待的情况下记为Ia,Ib
: 是否有,若Fa>Fb,一定Ia>Ib
: 同样,Double和Long是否也是这样?
--
FROM 104.134.27.*
你能测试一下1G的浮点数比较和1G个整数比较的性能差异吗?
【 在 webhost 的大作中提到: 】
: 我是遇到了大量浮点数的比较,最大可能G量级,我在想,转换成整数比较会不会快一点?还是说我想多了,其实对cpu来说,这两种比较没有区别?
:
--
FROM 104.134.27.*
有一段内存p1,里面存放了浮点数
我想这样做int *p2 = (int *)p1 当做整数数组来处理
这个我一直以为是叫强制转换
【 在 ble (ble) 的大作中提到: 】
: 这个应该说“二进制解释/翻译”吧,一般说强制转换是cast,是取整。
--
FROM 115.205.65.*
好像在C语言里(T)都叫强制转换,但是C++里做了区分
float f;
// 这俩其实都是强制转换,ip 和 &a甚至值都不变
int* pi = (int*) &f; // 1
int i = (int) f; // 2
但是对于1,程序员的真实需求通常是
int fi = *pi; // *((int*)&f);
这个就是重解释转换了:
int i = static_cast<int>(f);
int fi = *reinterpret_cast<int*>(&f);
// 这个转换就不允许了
int* pii = static_cast<int*>(&f);
// 但是兼容C的代码还是可以的
int* pii = (int*)&;
int fi = *pii;
【 在 webhost 的大作中提到: 】
: 有一段内存p1,里面存放了浮点数
: 我想这样做int *p2 = (int *)p1 当做整数数组来处理
: 这个我一直以为是叫强制转换
: ...................
--
FROM 104.134.27.*
如果你要保证一直都有结果,最好是转成整数(无符号或有符号)
要按浮点数比较的话,如果包含NaN之类的值,在包含这些值的情况下,浮点数集合上的比较操作不是全序
【 在 webhost 的大作中提到: 】
: 我是遇到了大量浮点数的比较,最大可能G量级,我在想,转换成整数比较会不会快一点?还是说我想多了,其实对cpu来说,这两种比较没有区别?
:
--
FROM 123.112.18.*
明白了,很清楚,受教,非常感谢!
【 在 ble (ble) 的大作中提到: 】
: 好像在C语言里(T)都叫强制转换,但是C++里做了区分
: float f;
: // 这俩其实都是强制转换,ip 和 &a甚至值都不变
: ...................
--
FROM 115.205.65.*
目标是寻找特定范围的浮点数,而内存里的数据是乱的,那很有可能就碰上您说的NaN,看来,我之前的理解是错的。
我以为所有的内存值,都能对应一个特定的浮点数,没想到还会有NaN,Inf.,而且,从规范看,有很多内存数据,都对应这两类。
或许得自己定义一个Float结构来解析?
【 在 Bernstein (Berns) 的大作中提到: 】
: 如果你要保证一直都有结果,最好是转成整数(无符号或有符号)
: 要按浮点数比较的话,如果包含NaN之类的值,在包含这些值的情况下,浮点数集合上的比较操作不是全序
--
FROM 115.205.65.*
作一些比特变换,应该可以变成无符号或有符号整数比较
因为符号位在最高位,接下来是指数部分,最后是尾数
【 在 webhost 的大作中提到: 】
: 目标是寻找特定范围的浮点数,而内存里的数据是乱的,那很有可能就碰上您说的NaN,看来,我之前的理解是错的。
: 我以为所有的内存值,都能对应一个特定的浮点数,没想到还会有NaN,Inf.,而且,从规范看,有很多内存数据,都对应这两类。
: 或许得自己定义一个Float结构来解析?
: ...................
--
FROM 123.112.18.*