Math 处理:只提取浮点数的小数作为浮点数
我需要知道一个浮点数的小数,一个像Math 处理:只提取浮点数的小数作为浮点数,math,floating-point,processing,Math,Floating Point,Processing,我需要知道一个浮点数的小数,一个像 float in1 = 2013.45 float in2 = 367.678 结果是 float out1 = 0.45 float out2 = 0.678 我看到了内置的,但它返回一个字符串。实现这一目标最优雅/方便的方式是什么 编辑:我试过了 float in = 2013.45; float out = in-floor(in); float in = 2013.45; float out = in-floor(in); 但是结果是0.449
float in1 = 2013.45
float in2 = 367.678
结果是
float out1 = 0.45
float out2 = 0.678
我看到了内置的,但它返回一个字符串。实现这一目标最优雅/方便的方式是什么
编辑:我试过了
float in = 2013.45;
float out = in-floor(in);
float in = 2013.45;
float out = in-floor(in);
但是结果是0.44995117,而不是0.45。中的阳性
:
out = in - (float) floor(in)
out = in - (float) ceil(in)
在
中为负数:
out = in - (float) floor(in)
out = in - (float) ceil(in)
在
中为正的:
out = in - (float) floor(in)
out = in - (float) ceil(in)
在
中为负数:
out = in - (float) floor(in)
out = in - (float) ceil(in)
编辑:我试过了
float in = 2013.45;
float out = in-floor(in);
float in = 2013.45;
float out = in-floor(in);
但结果是0.44995117,而不是0.45
这可能是正确的。您在这里看到的是。
为了简单起见,首先让我们假设计算机以10为基数工作(换言之,以十进制数字为单位)
2013.45在内部表示为2013.450。现在,当您减去整数部分时,4个有效数字变为零:
2013.450
- 2013
----------
.450
换句话说,4个有效数字丢失,结果最多只能精确到3个有效数字。要获得更精确的结果,您需要输入2013.450的更多位数。不幸的是,您被限制为7位32位浮点,对此您无能为力
在浮点计算中接下来发生的事情是,将(合成的)零追加到结果中,直到我们再次得到7个有效数字。这叫做规范化。在以10为基数的情况下,我们会意外地幸运,因为正确的数字恰好是0(很可能是您混淆的原因),但计算机在以2为基数的情况下工作。此代码以十六进制格式和C语言显示了如何在内部执行实际计算:
#include <stdio.h>
int main(int argc, char** argv) {
float x = 2013.45;
float floor_x = 2013;
float y = x - floor_x;
printf(" x = %a\n", x);
printf("floor(x) = %.6a\n", floor_x);
printf(" y = %.6a\n", y);
}
如您所见,y
通过在后面添加三个0
s进行了重新规范化。但是,正确的数字应该是以16为基数的c
我们在以10为基数时会很幸运,因为在以10为基数时,附加的零和真实数字会重合。
再来一张打印功能可以组成垃圾数字。计算机内部以基数2工作,但结果以基数10打印,因此需要从基数2转换为基数10。即使可以打印任意位数的浮点数,也不会比其内部精度更精确。C语言演示,打印1.1
最多15位:
#include <stdio.h>
int main(int argc, char** argv) {
float x = 1.1;
printf("x = %.15f\n", x);
}
在我的机器上。由于浮点有7个有效数字,所以第7位之后的所有内容都应视为垃圾。正如你所看到的,这是垃圾
计算float out=in楼层(in)后
在您的示例中,如果丢失了7位中的4位,您应该只打印最多3位的结果,这是您的责任。最多3位有效数字0.44995117等于0.450,这是您所期望的
编辑:我试过了
float in = 2013.45;
float out = in-floor(in);
float in = 2013.45;
float out = in-floor(in);
但结果是0.44995117,而不是0.45
这可能是正确的。您在这里看到的是。
为了简单起见,首先让我们假设计算机以10为基数工作(换言之,以十进制数字为单位)
2013.45在内部表示为2013.450。现在,当您减去整数部分时,4个有效数字变为零:
2013.450
- 2013
----------
.450
换句话说,4个有效数字丢失,结果最多只能精确到3个有效数字。要获得更精确的结果,您需要输入2013.450的更多位数。不幸的是,您被限制为7位32位浮点,对此您无能为力
在浮点计算中接下来发生的事情是,将(合成的)零追加到结果中,直到我们再次得到7个有效数字。这叫做规范化。在以10为基数的情况下,我们会意外地幸运,因为正确的数字恰好是0(很可能是您混淆的原因),但计算机在以2为基数的情况下工作。此代码以十六进制格式和C语言显示了如何在内部执行实际计算:
#include <stdio.h>
int main(int argc, char** argv) {
float x = 2013.45;
float floor_x = 2013;
float y = x - floor_x;
printf(" x = %a\n", x);
printf("floor(x) = %.6a\n", floor_x);
printf(" y = %.6a\n", y);
}
如您所见,y
通过在后面添加三个0
s进行了重新规范化。但是,正确的数字应该是以16为基数的c
我们在以10为基数时会很幸运,因为在以10为基数时,附加的零和真实数字会重合。
再来一张打印功能可以组成垃圾数字。计算机内部以基数2工作,但结果以基数10打印,因此需要从基数2转换为基数10。即使可以打印任意位数的浮点数,也不会比其内部精度更精确。C语言演示,打印1.1
最多15位:
#include <stdio.h>
int main(int argc, char** argv) {
float x = 1.1;
printf("x = %.15f\n", x);
}
在我的机器上。由于浮点有7个有效数字,所以第7位之后的所有内容都应视为垃圾。正如你所看到的,这是垃圾
计算float out=in楼层(in)后
在您的示例中,如果丢失了7位中的4位,您应该只打印最多3位的结果,这是您的责任。最多3位有效数字0.44995117等于0.450,这是您所期望的 当然最好只在%1中使用out=in
,它在
中适用于正的或负的,当然最好只在%1中使用out=in
,适用于
中的正或负如果处理具有下限功能,则x-floor(x)
(适用于正x)。您好,我尝试了这个方法,但它提供的输出不准确。您看到了用二进制表示十进制值的局限性。处理是否有一个十进制数据类型可以用来代替浮点?啊,不是。long
是一个整数数据类型。您可能无法处理字符串,或者double
类型可能会给出更可接受的结果。在数学中,这被称为字符串的“小数部分”