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
类型可能会给出更可接受的结果。在数学中,这被称为字符串的“小数部分”