- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 C 的一些内置函数有疑问。基本上,我试图创建的是我自己的 colpitts 振荡器计算器,它按顺序采用以下输入作为参数:电感值、电容器值、第二个电容器值。
输入可以以 F 或 H 结尾,也可以有前缀 p、m、n 和 u 来表示 pico、milli、nano 和 micro。如果数字太大,输出也会被格式化,并附加一个后缀。
插入调试 printf 语句后,我的程序出现的问题是数字转换不正确。
我按以下顺序使用了测试参数:
1p 2pF 3F
这是我的初始输出:
DEBUG Init proc: 1p
DEBUG post proc: 0.000000
DEBUG Init proc: 2p
DEBUG post proc: 0.000000
DEBUG Init proc: 3
DEBUG post proc: 3.000000
但是除了最后一行之外,DEBUG post proc 行是错误的。
我想看看:
DEBUG Init proc: 1p
DEBUG post proc: 0.000000000001
DEBUG Init proc: 2p
DEBUG post proc: 0.000000000002
DEBUG Init proc: 3
DEBUG post proc: 3.000000
这是我的代码:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(int argc,char* argv[]){
if (argc < 4){
printf("Need 3 args: L, C1, C2. %d supplied\n",argc-1);return -1;
}
long double nums[4],f;long isnum;
int n=0;
for (n=1;n<4;n++){
//process each arg
char *p=argv[n];while(*p != '\0'){p++;};p--;
//strip last character if it's F, f, H, or h
if (*p=='F' || *p=='f' || *p=='H' || *p=='h'){*p='\0';p--;}
printf("DEBUG Init proc: %s\n",argv[n]);
switch (*p){
case '0': //do nothing if new last character is a number
break;
case 'p': //convert picounit to unit
*p='\0';
nums[n]=strtoll(argv[n],NULL,10)/1000000000000ULL;
break;
case 'n': //convert nanounit to unit
*p='\0';
nums[n]=strtoll(argv[n],NULL,10)/1000000000ULL;
break;
case 'u'://convert microunit to unit
*p='\0';
nums[n]=strtoll(argv[n],NULL,10)/1000000ULL;
break;
case 'm'://convert milliunit to unit
*p='\0';
nums[n]=strtoll(argv[n],NULL,10)/1000ULL;
break;
default: //do nothing if new last character is a number from 1 to 9 or print error if it isn't u,m,n or p.
isnum=strtol(p,NULL,10);
if (isnum < 1 || isnum > 9 || isnum=='\0'){
printf("Number %d is in bad format. Use suffix of either: uH mH nH pH uF mF nF pF\n",n);
return -1;
}
nums[n]=strtoll(argv[n],NULL,10);
}
printf("DEBUG post proc: %Lf\n",nums[n]);
}
printf("Input values: %Lf,%Lf,%Lf\n",nums[1],nums[2],nums[3]);
//calculate frequency
f=1/(2*3.14159)*sqrt(nums[1]*((nums[2]*nums[3])/(nums[2]+nums[3])));
char suf=' '; //prepare suffix to display frequency in user friendly format
if (f > 1000000){f=f/1000000;suf='M';} //convert to Mhz if f > 1000000
if (suf=='\0' && f > 1000){f=f/1000;suf='K';}
printf("Frequency = %Lf %c hz\n",f,suf);
return 0;
}
由于我只有一个 32 位处理器可以使用,所以我觉得我对此的回答是有限的。我该怎么做才能纠正这个问题?
最佳答案
首先 - 正如 Evert 所提到的 - 你正在进行整数除法。编写 nums[n]=strtoll(argv[n],NULL,10)/(1000000000000.0);
或 nums[n]=((double)strtoll(argv[n],NULL ,10))/1000000000000ULL
应该可以解决这个问题。
一旦您的数字正确,输出可能四舍五入到小数点后第 6 位:
C99 §7.19.6.1 The
fprintf
function,f
,F
A
double
argument representing a floating-point number is converted to decimal notation in the style[−]ddd.ddd
, where the number of digits after the decimal-point character is equal to the precision specification. If the precision is missing, it is taken as 6; ...
写 printf("DEBUG post proc: %1.15Lf\n",nums[n])
你应该会看到余数。
关于c - strtoll 和 division 没有返回正确的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43837469/
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我无法理解这段代码: static long long _be_decode_int(const char **data, long long *data_len) { char *endp;
我知道如何将字符串转换为 int、float...从来都不是一个新问题。在浏览了一些文章后,建议我使用 strtol、strtoll、strtod,因此我仔细研究了这些函数。 虽然strtol在其ma
我正在使用 strtoll 函数将字符串转换为长整型。当输入字符串为 63 个字符时,我没有遇到任何问题。 但是当它超过 63 个字符时,就会给出错误的结果。 char *pEnd1; long lo
我必须从一个包含一堆二进制数的文本文件中读取数据,然后将它们转换为整数并将它们存储在一个数组中。我已经创建了一个函数来执行此操作,但是该函数只返回一个数字。它似乎没有通过文件,或者它只是不起作用。谁能
我对 C 的一些内置函数有疑问。基本上,我试图创建的是我自己的 colpitts 振荡器计算器,它按顺序采用以下输入作为参数:电感值、电容器值、第二个电容器值。 输入可以以 F 或 H 结尾,也可以有
我在这里面临的主要问题是 strtoll() 在 VC 2010 中被标记为错误(error C3861: 'strtoll': identifier not found)。如果我用 strtol()
这是我的 C 代码: char *ptr = "0xfff1342809062Cac"; char *pEnd; long long value = strtoll(ptr,
这是我从谷歌的 gflags 源代码中读取的代码片段 case FV_INT32: { const int64 r = strto64(value, &end, base); if (errn
例如。我有一个十六进制字符串“1800272100A1”。我试着把它转换成十六进制号。 1800272100A1 使用 ssanf() 如下, sscanf(out1,"%lld",&r1);
我正在尝试将一些字符转换为数字类型,但其中一些可能不是以 null 结尾的字符串。那么 strtol、strtoll 和 strtod 对于那些不是以 null 结尾的字符串安全吗? 最佳答案 没有。
我是一名优秀的程序员,十分优秀!