String 把浮点数变成字符串

String 把浮点数变成字符串,string,assembly,floating-point,ieee-754,floating-point-precision,String,Assembly,Floating Point,Ieee 754,Floating Point Precision,我接着说明了何时需要将IEEE-754单精度和双精度数字转换为以10为基数的字符串。有可用的FXTRACT指令,但它只为基数2提供指数和尾数,因为数字计算公式是: value = (-1)^sign * 1.(mantissa) * 2^(exponent-bias) 若我有一些针对特定基数的对数指令,我将能够改变表达式中2exponent-bias部分的基数,但目前我不知道该怎么做。我也在考虑使用标准的四舍五入转换为整数,但它似乎无法使用,因为它不能提供精确的转换。有人知道做这件事的方法/基

我接着说明了何时需要将IEEE-754单精度和双精度数字转换为以10为基数的字符串。有可用的
FXTRACT
指令,但它只为基数2提供指数和尾数,因为数字计算公式是:

value = (-1)^sign * 1.(mantissa) * 2^(exponent-bias)
若我有一些针对特定基数的对数指令,我将能够改变表达式中2exponent-bias部分的基数,但目前我不知道该怎么做。我也在考虑使用标准的四舍五入转换为整数,但它似乎无法使用,因为它不能提供精确的转换。有人知道做这件事的方法/基本原则吗?请帮忙

我终于找到了另一个解决方案(它是Java的)

{
/*处理-infinity、+infinity和NaN,如果'f'不是其中之一,则返回“”*/
字符串ret=“”;
如果((ret=getSpecialFloats(f)).length()!=0)
返回ret;
}
int num=Float.toRawIntBits(f);
int指数=(int)((num>>23)和0xFF)-127)//8比特,偏差127
int尾数=num&0x7FFFFF//23位
/*存储十进制指数*/
整数十进制指数=0;
/*用于计算的临时值*/
int边乘法器=1;
对于(;指数>0;指数--){
/*在这个循环中,我计算的是exponent.MAX(unsigned int)=2^32-1的值,而exponent可以是2^127 pr st,就像这样*/
侧乘法器*=2;
/*正因为如此,如果设置了sideMultiplicator的前两位,我们就接近溢出了,我们需要将一些值保存到decimalExponent中*/
如果((侧乘法器>>30)!=0){
十进制指数+=3;
侧乘法器/=1000;
}
}
对于(;指数<0;指数++){
/*这个循环的作用与前面的循环完全相同,但反之亦然(对于指数<0,如2^-3等)*/
如果((侧乘法器&1)!=0){
侧乘法器*=10;
十进制指数--;
}
侧乘法器/=2;
}
/*我们知道浮点数的值为:
*1.尾数*2^指数*(-1)^符号*/
/*这就是为什么我们需要在result(另一个临时值)之间存储1*/
int betweenResult=边乘法器;
对于(整数分数=2,位=0;位<23;位++,分数*=2){
/*这个循环是最重要的:它通过除以我们在指数中得到的值,将二进制尾数转化为实数*/
if(((尾数>>(22位))&1)==1){
/*如果设置了尾数[bit],则需要将整数除以分数(分数为2^(bit+1))*/
而(边乘法器%分数>0&(结果>>28之间)==0){
/*正如我们之前所需要的:若数字接近溢出,则将某些内容存储在decimalExponent中*/
介于结果*=10之间;
侧乘法器*=10;
十进制指数--;
}
中间结果+=边乘法器/分数;
}
}
/*小规格化将介于结果之间的15700等数字转换为157e2(将零填充存储在十进制指数变量中)*/
while(介于结果%10==0之间){
介于nResult/=10之间;
十进制指数++;
}
/*此方法以要求的符号(科学、十乘或正态)获取字符串*/
返回getExponentedString(介于结果和小数点之间);

如果可以按1.d1d2d3d4d5…*2^e1e2e3打印,则将浮点数转换为十进制(-ish)表示形式可能很简单。可以找到一个实现


如果你需要一个科学的1.d1d2…*10^e1e2e3表示法,那么简单的方法就是重复除以10,然后从浮点格式的数字中提取数字。您将需要某种类型的多精度整数库。(重复乘以10以提取点后的数字。)

格式化浮点数非常重要。例如,搜索Dragon4算法()

非常,非常天真,你可以试试这个:

  • 处理NaN和无限

  • 打印标志(选中
    <0
    )。假设从今以后这个数字是正实数

  • 如果
    =1
    ,则截断并使用熟悉的整数格式打印整数部分。(任何带有浮点单元的硬件上都应该有一条机器指令。)

  • 打印小数点分隔符;现在继续乘以10并打印截断的整数

  • 达到所需精度时停止;考虑将最后一位数字正确舍入

  • 这是正确的。但是,您可以在没有任何循环(或更少的循环数)的情况下更快地完成。只需将分数部分乘以10即可。如果以浮点类型进行计算,减少数字或乘法也会减少累积误差。要进行精确转换,必须使用更高精度的浮点类型


    例如,要将0.1234567转换为5位精度,将数字乘以10000,得到整数部分。如果需要四舍五入,请将其乘以100000,然后将最后一个数字四舍五入

    我不熟悉这种语言,但仍然感谢您的帮助。我想我会选择天真的方式。非常感谢。顺便问一下,那“非常”呢?如果它是“非常”慢的方式?@user35443:因为我在没有考虑效率的情况下快速创建了这个,我想这将是非常慢的。我认为《龙4》的意义在于与当时的藏书楼相比要快。我不知道任何细节,但想象一下我的想法除以10很多,这是一个相当慢的计算。为什么不链接到一个标准的C库中,调用
    printf
    sprintf
    ?重复的,而且很难这么快完成,@PascalCuoq已经写了一篇关于这个的文章,请将答案作为答案发布,不编辑问题。这种方法在不关心精确舍入,也不关心接近类型限制的精度的情况下是快速而简单的。我建议最后一步可以通过multi简化