gpt4 book ai didi

c - 最大 float 分数

转载 作者:太空宇宙 更新时间:2023-11-04 07:26:31 24 4
gpt4 key购买 nike

  • 平台:Linux 3.2.0 (Debian 7.0)
  • 编译器:GCC 4.7.2 (Debian 4.7.2-5)

我正在尝试将字符串转换为 float 。我知道已经有功能可以做到这一点。我这样做只是为了练习。我的函数适用于 123.123、1234、-678.8 等简单数字。但是当我尝试将字符串 .99999999 转换为 float 时,我最终得到的是 1。这显然是个问题。我不知道这是因为 .99999999 不能用 float 表示还是我做错了什么。我要问的问题是如何计算 float 可以表示的最大分数。由于没有更好的术语,我如何知道 float 何时即将溢出?

这是我目前所拥有的。

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

int cstrtof(const char *cstr, float *f);
int cstrtof(const char *cstr, float *f)
{
unsigned short int i = 0;
unsigned short int bool_fraction = 0;
float tmp_f = 0;

if(cstr[0] == '\000') return -1;
else if(cstr[0] == '-') i = 1;

for(; cstr[i] != '\000'; i++)
{
printf("tmp_f = %f\n", tmp_f);
if(cstr[i] >= '0' && cstr[i] <= '9')
{
if(tmp_f > (FLT_MAX - (cstr[i] - '0')) / 10) return -2;
else tmp_f = tmp_f * 10 + (cstr[i] - '0');
}
else if(cstr[i] == '.') bool_fraction = i+1;
else return i+1;
}

printf("tmp_f = %f\nbool_fraction = %i\n", tmp_f, bool_fraction);

if(bool_fraction)
{
for(bool_fraction--; bool_fraction < i-1; bool_fraction++, tmp_f /= 10)
{
printf("tmp_f = %f\n", tmp_f);
}
}

printf("tmp_f = %f\nbool_fraction = %i\n", tmp_f, bool_fraction);

if(cstr[0] == '-') *f = tmp_f*-1;
else *f = tmp_f;

return 0;
}

int main(int argc, char *argv[])
{
float f = 0;
int return_value = 0;

return_value = cstrtof(argv[1], &f);
if(return_value == 0)
{
printf("f = %.11f\n", f);
}
else if(return_value == -1)
{
printf("ERROR Empty String\n");
}
else if(return_value == -2)
{
printf("ERROR Data Type Overflow\n");
}
else
{
printf("ERROR Invalid character '%c'\n", argv[1][return_value-1]);
}

return 0;
}

此外,cstrtof() 是基于以下函数。

int cstrtoslli(const char *cstr, signed long long int *slli)
{
unsigned short int i = 0;
signed long long int tmp_slli = 0;

if(cstr[0] == '\000') return -1;
else if(cstr[0] == '-') i = 1;
else if(cstr[0] == '0') return -2;

for(; cstr[i] != '\000'; i++)
{
if(cstr[i] >= '0' && cstr[i] <= '9')
{
//LLONG_MAX is defined in limits.h
if(tmp_slli > (LLONG_MAX - (cstr[i] - '0')) / 10) return -3;
else tmp_slli = tmp_slli * 10 + (cstr[i] - '0');
}
else return i+1;
}

if(cstr[0] == '-') *slli = tmp_slli*-1;
else *slli = tmp_slli;

return 0;
}

最佳答案

小于 1 的最大可表示 float 值由 nexttowardf(1, -INFINITY) 返回。

这通常有一个不同的小数部分,例如,小于 2 的最大可表示 float 值,即 nexttowardf(2, -INFINITY)。这是因为不同大小的数字通常具有不同数量的可用于小数部分的位数(因为一些位数用于整数部分)。大数的小数部分为零。

float 是现代实现中常见的 IEEE-754 32 位二进制浮点值时,小于 1 的最大 float 是 0.999999940395355224609375。当将十进制数字转换为 float 的例程质量良好且舍入模式为最接近(常见默认值)时,数字从舍入到 0.999999940395355224609375 到舍入到 1 的点在中间这两个值(准确的中点将四舍五入为 1)。

将十进制数字正确转换为二进制 float 很复杂。这是一个已解决的问题,并且有关于它的学术论文,但如果它能正常工作,您通常应该依赖现有的库代码。自己正确地完成这项工作需要投入大量时间。

关于c - 最大 float 分数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17903428/

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