Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检查C+中双精度编码长度的有效方法+;_C++_Math - Fatal编程技术网

C++ 检查C+中双精度编码长度的有效方法+;

C++ 检查C+中双精度编码长度的有效方法+;,c++,math,C++,Math,假设我有一个数字,100000,我可以用一些简单的数学来检查它的大小,即log(100000)->5(以10为底的对数)。还有另一种方法,速度很慢std::string num=std::to_string(100000),num.size()。有没有办法从数学上确定一个数字的长度?(不仅仅是100000,还包括2313455、123876132……等)为什么不使用ceil?它四舍五入到最接近的整数-您只需将其环绕在日志函数中,然后添加一个检查,以发现10的幂返回的值将比预期值少1。如果数字是整

假设我有一个数字,
100000
,我可以用一些简单的数学来检查它的大小,即
log(100000)->5
(以10为底的对数)。还有另一种方法,速度很慢
std::string num=std::to_string(100000)
num.size()
。有没有办法从数学上确定一个数字的长度?(不仅仅是100000,还包括2313455、123876132……等)为什么不使用
ceil
?它四舍五入到最接近的整数-您只需将其环绕在日志函数中,然后添加一个检查,以发现10的幂返回的值将比预期值少1。

如果数字是整数,则继续除以10,直到达到0为止。例如,你必须将100000除以6次。对于小数部分,您需要一直乘以10,直到
trunc(f)=f

以下是使用O(1)中的单精度浮点数解决问题的方法:

#包括
#包括
int main(){
浮点x=500;//要转换
uint32\u t f=*(uint32\u t*)&x;//将浮点转换为可管理的整数
uint8_t exp=(f&(0b11111111>23;//获取指数
exp-=127;//浮点偏差
exp/=3.32;//这将四舍五入,但在这种情况下应该可以(ln2(10))

std::你是说除了以10为底的对数以外的数学方法吗?是的,我不会得到一个直接的
5
250000
@NathanPiersonmbe上做一个以10为底的日志,你可以对这个数字使用模运算,直到它等于0,然后检查它需要多少次?这比数学更程序化,不过…这是不是回答你的问题吗?事实上,一个数字的以10为底的对数的整数值可能会起作用。它会和一个双精度的9.999997一样出错。不过,不确定这是否在表上。是的,它起作用了!与对数解算器的log()相比,这似乎相当慢快?我不知道它有那么快。无论如何,你可以自己写。在这种情况下,你将使用mul而不是div。我们必须进行适当的比较。因为bignums浮点数无论如何都是不合适的。@asjhdbashjdbasjhdbhjb对于low N,简单而缓慢的算法往往比更智能的算法表现得更好,因为你必须添加的智能从O(N)到O(Log(N))的算法通常会有抵消更智能算法收益的成本。典型的
double
实现最多只能获得300位数字,这可能是微不足道的,也可能不是微不足道的,这取决于
log
实现的速度。6位数字很可笑,几乎肯定会比
log
计算得更快。在300位时,这两个数字都可以可能比
使用字符串更昂贵
为什么不使用
frexp()
更清楚?@user1095108我不知道它的存在,但你可以使用它你可以修正你的答案,它比比特破解更好。或者至少第二个答案,反正是编辑。@user1095108
frexp()
可能也会这样做,或者类似。我不想用just use
frexp()
来代替我的答案,因为它a)不会改变某些浮点指针黑客攻击发生的事实,b)它只是抽象了它工作的原因,以及如何工作。它将提供一个替代答案1中提供的选项。