gpt4 book ai didi

c++ - 以下代码有什么问题?它在不使用 sprintf 或 ostream 的情况下将 double 转换为 string

转载 作者:搜寻专家 更新时间:2023-10-31 01:45:09 24 4
gpt4 key购买 nike

我写了下面的代码来将 double 转换为字符串。我不应该使用 sprintf 或 ostream 。输出非常不稳定。

对应输出的输入列表:

  • 2.0 2.0
  • 2.5 2.5
  • -2.0 -2.0
  • 2.987 2.9879947598364142621957397469375
  • -2.987 -2.9879947598364142621957397469375
这些额外的数字是从哪里来的,如何克服这个问题?我的代码可以在下面找到。

#include <iostream>
#include <math.h>

using namespace std;

string reverse(string input);
string myDtoA(double num);
string itoa(int num);

int main()
{
double inp=-2.987;
cout<<myDtoA(inp)<<endl;
}

string myDtoA(double num)
{
if(num>0)
{
int inPart;
double intPart,fractPart;
fractPart = modf(num,&intPart);
inPart=(int)intPart;
string ret;
ret = itoa(inPart);
if(fractPart!=0)
{
ret.append(".");
double ceilOfFraction = ceil(fractPart);
while(ceilOfFraction !=0)
{
double inP,fP;
fractPart*=10;
fP=modf(fractPart,&inP);
int a =(int)inP;
ret.append(itoa(a));
fractPart=fP;
ceilOfFraction = ceil(fractPart);
}
}
else
{ret.append(".0");}
return ret;
}
else if(num==0)
{
return "0";
}
else if(num<0)
{
string ret = "-";
ret.append(myDtoA(-num));
return ret;
}
}

string itoa(int num)
{
char* str = new char[120];
int i=0;
// Process individual digits
while (num != 0)
{
int rem = num % 10;
str[i++] = (rem > 9)? (rem-10) + 'a' : rem + '0';
num = num/10;
}
string ret(str);
return reverse(ret);
}

/* A utility function to reverse a string */
string reverse(string input)
{
return std::string(input.rbegin(), input.rend());
}

最佳答案

舍入浮点输出很难。

这是我找到的关于这个主题的最新论文:

http://www.cs.tufts.edu/~nr/cs257/archive/florian-loitsch/printf.pdf

在脚注中,您会找到对以下内容的引用:

[Steele Jr. and White(2004)] G. L. Steele Jr. and J. L. White. How to print floating-point numbers accurately (retrospective). In 20 Years of the ACM SIGPLAN Conference on Programming Language Design and Implementation 1979-1999, A Selection, pages 372–374. ACM, 2004. ISBN 1-58113-623-4. doi: 10.1145/989393.989431.

这是一个精彩的阐述。没有人能够挑选您的程序并告诉您如何处理它。

关于c++ - 以下代码有什么问题?它在不使用 sprintf 或 ostream 的情况下将 double 转换为 string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22543349/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com