当我运行以下代码时,输出正好是十进制的数字2 500 。
(关于ubuntu的g ++ 5.3.1)
#include<iostream>
#include<cmath>
using namespace std;
int main(){
cout.precision(0);
cout << fixed << pow(2.0,500.0);
return 0;
}
我想知道C ++如何以如此高的精度将这个浮点数转换为十进制字符串。
我知道2 500 可以用IEEE 754格式准确呈现。但我认为mod 10
和divided by 10
会导致浮点数的精度损失。转换进行时使用了什么算法?
答案 0 :(得分:4)
是的,2 500 存在精确的双精度浮点表示。但是,您不应该假设pow(2.0,500.0)
产生此值。函数pow
无法保证准确性,您可能会发现pow(10.0, 2.0)
100.0
产生的SO questions没有产生1000…<500 zeroes in total>…
,尽管数学结果也完全可以表示。 / p>
但无论如何,要回答你的问题,从浮点二进制表示到十进制的转换通常不依赖于浮点运算,这对于最终结果的预期准确性来说确实太不准确了。通常,准确转换需要reliance on big integer arithmetics。例如,在2 500 的情况下,天真算法将重复将用二进制 let url_to_request = "http://11.22.33.44:8080/SRV/addRepertoire"
var params = "owner=\(User.sharedInstance.email)&adresse=\(adresse.text!)&nom=\(nom.text!)&telephone=\(telephone.text!)&commentaires=\(commentaires.text!)"
//trying to encode in ISO-8859-1
let dt = NSString(CString: params, encoding: NSISOLatin1StringEncoding)
//preparing string to be used in a NSURL
let final_url = dt!.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())
print("URL loadRepertoire: \(url_to_request+"?"+final_url!)")
写的大整数除以10。
在某些情况下,可以使用浮点运算,例如利用10到10 23 的功率完全用IEEE 754双精度表示的事实。但是二进制浮点和十进制浮点之间的正确舍入转换总是需要大整数算术,这在远离1.0的情况下尤为明显。