当前位置: 首页 > 知识库问答 >
问题:

Java编译器的文本到浮点值转换不同于strtod吗?

澹台景山
2023-03-14

Java语言规范第3.10.2点规定,浮点值按照IEEE 754标准的规定进行转换。对于strtod,C标准规定了函数如何将文本转换为浮点值。关于陈述本身,两者似乎涵盖了相同的案例。我不确定的是,舍入规则怎么样?Java编译器所做的转换与strtod所做的不同吗?

背景是,我想编译Java字节码代码,因此需要转换类文件中表示的浮点/双重值的文本表示。

例如,此Java代码打印更精确的值:

double value = 1.23412991913372577889911;
System.out.println(value);
// Output: 1.2341299191337258

使用strtod转换相同的值并打印出来会打印出不太准确的值:

const char* textual = "1.23412991913372577889911";
double result = strtod(textual, ...);
std::cout << result << std::endl;
// Output: 1.23413

这是一个输出问题,还是值实际上以不同的方式转换?

编辑:正如Pascal Cuoq所评论的,当以全精度打印值时(我是通过设置std::cout.precision()),这些值是相等的,所以我假设转换会导致相同的值。我想我会为此做个测试。:-)

共有1个答案

查宜修
2023-03-14

是的,有区别。以下是我能找到的两个。

>

  • Java支持数字之间的下划线。根据规范:

    下划线可以用作表示整数部分的数字之间、表示小数部分的数字之间以及表示指数的数字之间的分隔符。

    这对你来说应该不是问题。你只需要去掉所有的下划线。

    Java强制执行IEEE 754浮点算法的四舍五入规则。从Java规范(语言规范指的是Double.valueOf):

    [this]精确的数值然后在概念上转换为“无限精确”的二进制值,然后根据IEEE 754浮点算术的通常舍入到最近规则舍入为双精度,其中包括保留零值的符号。

    strtod的四舍五入模式由实现定义,IIUC甚至允许1 ULP的误差。根据C99规范(strtod文件参考第6.4.4.2节):

    对于十进制浮动常数,以及当FLT_基数不是2的幂时的十六进制浮动常数,结果要么是最近的可表示值,要么是紧邻最近的可表示值的较大或较小的可表示值,以实现定义的方式选择。

    只有当你的C编译器支持附件F:IEC 60559浮点运算,strtod才保证符合IEEE 754(IEC 60559和IEEE 754是等价的):

    浮点常量和strtod、strtof、strtold、fprintf、fscanf的转换时间转换,以及中的相关库函数

    还要注意的是,strod仅从C99开始支持十六进制浮点表示法(Java从版本5开始)。因此,请检查strod的实现是如何运行的。

  •  类似资料:
    • 考虑下面这个简短的C++程序: 如果我在不同的编译器上编译它,我会得到不同的结果。对于CLANG3.4和GCC 4.4.7,它打印,而Visual Studio 2013打印,这意味着它们在调用不同的强制转换操作符。根据标准,哪一个是正确的行为? 根据我的理解,不需要转换,而需要到的转换,因此编译器应该选择第一个。对此做了什么吗?const-conversion是否被编译器认为更“昂贵”? 如果删

    • 每当我在我的计算机(Ubuntu 13.10,AMD64)上编译更少的css文件时,我得到的浮点结果与我的同事在他的计算机(Mac OSX 10.6)上编译的结果截然不同。这一切都很好。浮点数学等等。这些数字基本上是一样的。胡说八道。 但是,这使得区分和提交输出非常烦人。我最终发现了数百个可以忽略的问题: 我能做些什么来避免这个问题?

    • 我有一个问题,我必须把公里转换成英里。我是一个新手程序员,所以请原谅我。 这是我到目前为止的代码: 它给我一个错误提示:

    • 相同版本的代码优化是否有任何差异:OracleJava编译器ApacheJava编译器IBMJava编译器OpenJDKJava编译器。如果有什么代码可以展示不同的优化?或者他们使用相同的编译器?如果没有已知的优化差异,那么我在哪里可以找到关于如何测试不同优化的编译器的资源?

    • 在Stroustrup的新书《C编程语言-第四版》第10.5.1节中,他说,在执行算术运算之前,整数提升用于从较短的整数类型中创建整数,类似地,浮点提升用于从浮点中创建双精度。 我用以下代码确认了第一个索赔: 这将输出带有vc的“int”和带有gcc的“i”。 但是,用浮点而不是短路进行测试,输出仍然是“浮点”或“f”: 根据Stroustrup的说法,浮点提升规则没有例外,所以我希望输出“dou

    • 问题内容: Python Decimal不支持从float构造。它期望您必须先将float转换为字符串。 这非常不方便,因为float的标准字符串格式器要求您指定小数位数而不是有效位数。因此,如果您的数字最多可能有15个小数位,则需要将其格式设置为Decimal(“”%。15f“%my_float),如果您之前还有任何有效数字的话,也会在第15个小数位出现垃圾十进制。 有人可以建议一种在用户输入时