如何使用float.h宏来增强浮点精度

时间:2017-04-22 00:31:53

标签: c macros floating-point precision

据我所知answer,有一种方法可以通过宏float.h使用LDBL_MANT_DIG扩展精度。我的目标是提高double值的浮点精度,以便我可以存储更准确的数字,例如0.000000000566666而不是0.000000。请问,有人可以举一个简短的例子来使用这个宏,以便我可以扩展存储在缓冲区中的精度吗?

3 个答案:

答案 0 :(得分:2)

您关于想要存储更准确数字的评论,以便您不仅仅import re def standardize(url): return re.sub("^https?://",'',url.lower()) # with 'https' print(standardize('https://myurl.com/RANDoM')) # prints 'myurl.com/random' # with 'http' print(standardize('http://myurl.com/RANDoM')) # prints 'myurl.com/random' # both works 表明问题不在存储中,而在于您打印数字的方式。请考虑以下代码:

0.000000

运行时,它会产生:

#include <stdio.h>

int main(void)
{
    float f = 0.000000000566666F;
    double d = 0.000000000566666;
    long double l = 0.000000000566666L;

    printf("%f  %16.16f  %13.6e\n", f, f, f);
    printf("%f  %16.16f  %13.6e\n", d, d, d);
    printf("%lf  %16.16lf  %13.6le\n", d, d, d);
    printf("%Lf  %16.16Lf  %13.6Le\n", l, l, l);
    return 0;
}

如您所见,使用默认的0.000000 0.0000000005666660 5.666660e-10 0.000000 0.0000000005666660 5.666660e-10 0.000000 0.0000000005666660 5.666660e-10 0.000000 0.0000000005666660 5.666660e-10 格式会打印6个小数位,将值视为"%f"。但是,当显示更精确的格式时,值会正确存储并且可以显示更多的小数位,或者使用0.0格式,或者实际上使用%e格式,尽管代码不是&#39 ; t表示在使用中 - 输出与此示例中的%g格式相同。

%e转换规范与%f%lf相对,表示打印%Lf&#39;。请注意,当double值传递给float时,它们会自动转换为printf()(正如短于double的数字类型被提升为int)。因此,int可用于%ffloat类型,实际上double格式(在C99中定义 - 其他所有内容都在C90中定义)可以是用于格式化%lffloat值。 double格式需要%Lf

仅使用long double中的任何宏,都无法在floatdouble中存储更高的精确度。这些是对浮点类型特征及其行为方式的更多描述。

答案 1 :(得分:0)

您引用的答案仅提到宏等于您可以存储的精确位数。它不能以任何方式提高精度。但宏观是为了长期双打而不是双打。如果您需要比double类型更精确的话,可以使用long double类型:

 long double x = 3.14L;

注意&#34; L&#34;在指定long double literal的数字之后。

答案 2 :(得分:0)

浮点类型在硬件中实现。精度在整个行业中标准化,并融入CPU的电路中。除了扩展精度软件库(如GMP)之外,没有办法将其增加到long double以上。

好消息是浮点数不会在前导零中陷入困境。 0.000000000566666不会舍入为零。只有六位数字,您甚至只需要一个单精度float来表示它。

math.h(不是float.h)存在问题,其中POSIX标准未能提供具有long double精度的π和 e 。有几种解决方法:GNU定义了例如M_PIlM_El,或者您也可以使用预处理器将l粘贴到另一个库中的这些文字常量(给出数字long double类型)并希望备用数字