据我所知answer,有一种方法可以通过宏float.h
使用LDBL_MANT_DIG
扩展精度。我的目标是提高double
值的浮点精度,以便我可以存储更准确的数字,例如0.000000000566666
而不是0.000000
。请问,有人可以举一个简短的例子来使用这个宏,以便我可以扩展存储在缓冲区中的精度吗?
答案 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
可用于%f
和float
类型,实际上double
格式(在C99中定义 - 其他所有内容都在C90中定义)可以是用于格式化%lf
或float
值。 double
格式需要%Lf
。
仅使用long double
中的任何宏,都无法在float
或double
中存储更高的精确度。这些是对浮点类型特征及其行为方式的更多描述。
答案 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_PIl
和M_El
,或者您也可以使用预处理器将l
粘贴到另一个库中的这些文字常量(给出数字long double
类型)并希望备用数字