C 使用时间\u t分析用户输入

C 使用时间\u t分析用户输入,c,time-t,C,Time T,我的想法是,如果用户输入t=2.5,那么我将在两个不同的变量中分别提取2和0.5。但我无法做到这一点 代码如下: $ export LT_LEAK_START=1.5 $ echo $LT_LEAK_START 1.5 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { double d; time_t t; long nsec; d=strtod(ge

我的想法是,如果用户输入
t=2.5
,那么我将在两个不同的变量中分别提取2和0.5。但我无法做到这一点

代码如下:

$ export LT_LEAK_START=1.5
$ echo $LT_LEAK_START
   1.5

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
 double d;
 time_t t;
 long nsec;

 d=strtod(getenv("LT_LEAK_START"), NULL);
 t=(time_t)d;

 nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
 printf("d = %lf\n",d);
 printf("t = %u, nsec = %f\n",d,nsec);
}

您试图将
.5
分配给一个
长的
,但这不会发生

double d = 1.5;
int i = (int)d;
double j = d - (double)i;

printf("%d %f\n",i,j);

你的输出被破坏了。实际上,您正在以下代码中写入
d
的值两次:

nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
printf("d = %lf\n",d);
printf("t = %u, nsec = %f\n",d,nsec);
如果你写了这个:

nsec=d-(double)((time_t)d); // Extract fractional part as time_t always whole no.
printf("d = %lf\n",d);
printf("t = %u, nsec = %f\n",t,nsec);
然后您将获得输出:

d = 1.500000
t = 1, nsec = 0.000000

现在更清楚的是,你有一个舍入误差。在本例中,通过将0.5指定给
nsec
,一个
长的
,可以舍弃所有小数位。将
nsec
改为
float

您还试图在长时间内存储一个分数值。您需要将其乘以1000或将
nsec
设为双精度

nsec=d-(双倍)((时间)d)


如果d为1.5,则右侧的结果将为0.5,当它存储在nsec中时,将隐式向下转换为0。

这种情况下的解决方案是什么。我还不知道该怎么做。请帮助我。他使用的是格式标志
%f
,因此
nsec
应该是
float
,而不是
double
。%f是printf格式标志,与您描述的内容无关f适用于显示浮动和双精度。%f中的f仅表示“浮点”,而不是单精度浮点f将显示一个双精度,很好。@Luke:真的吗?那么什么是
%lf
?(这是相关的,因为如果他使用了错误的类型,那么他调用的是UB。)是的,实际上,
l
修饰符不适用于浮点,请参见下面链接中的“长度”。如果你的意思是
%Lf
,那么这是一个长双精度码,比双精度码更精确@卢克:不,我是说
%lf
。如果
%f
使用
双精度
是安全的,则确定。不过,我更喜欢C引用C++引用。C++是一种不同的语言。(C++的C标准库中存在兼容性差异。)
d = 1.500000
t = 1, nsec = 0.000000