gpt4 book ai didi

c - 任何人都知道如何将一个巨大的字符数组转换为 float ,非常巨大的数组,性能比 atof/strtod/sscanf 好

转载 作者:行者123 更新时间:2023-12-04 06:59:59 25 4
gpt4 key购买 nike

我得到了一个 char 数组,一个巨大的数组 char p[n] 从 txt 中读取。

//1.txt194.919 -241.808 234.896195.569 -246.179 234.482194.919 -241.808 234.896...

foo(char *p, float x, float y, float z){

}

I tried to use atof, strtod, but they are real time consuming when the array is too huge, because they will call the strlen(). and the sscanf is also very slow....

I debug into the code and find that both atof() and strtod call the strlen() in the visual studio, we can check the crt code.

strtod() call:
answer = _fltin2( &answerstruct, ptr, (int)strlen(ptr), 0, 0, _loc_update.GetLocaleT());


atof() call:
return( *(double *)&(_fltin2( &fltstruct, nptr, (int)strlen(nptr), 0, 0, _loc_update.GetLocaleT())->dval) );

我也尝试使用strtok,但是我们不应该更改1.txt 中的任何数据。

所以任何人都有将所有这些转换为 float x、y、z 的最佳方法。

Visual Studio 2008 + WIN7

最佳答案

如果您可以对浮点值的格式做出额外的假设,那么自己解析它们可能会提高性能。

解析示例代码 ' ''\n' - 没有指数和没有输入验证的分隔值:

float parsef(const char **str)
{
const char *cc = *str;

_Bool neg = (*cc == '-');
if(neg) ++cc;

float value = 0, e = 1;

for(; *cc != '.'; ++cc)
{
if(*cc == ' ' || *cc == '\n' || !*cc)
{
*str = cc;
return neg ? -value : value;
}

value *= 10;
value += *cc - '0';
}

for(++cc;; ++cc)
{
if(*cc == ' ' || *cc == '\n' || !*cc)
{
*str = cc;
return neg ? -value : value;
}

e /= 10;
value += (*cc - '0') * e;
}
}

示例代码:
const char *str = "42 -15.4\n23.001";
do printf("%f\n", parsef(&str));
while(*str++);

关于c - 任何人都知道如何将一个巨大的字符数组转换为 float ,非常巨大的数组,性能比 atof/strtod/sscanf 好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2033845/

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