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