t****t 发帖数: 6806 | 1 This is the man page of atof(). I think it can not be any more clear.
DESCRIPTION
The atof() function converts the initial portion of the string
pointed to by nptr to double. The behavior is the same as
strtod(nptr, (char **) NULL);
except that atof() does not detect errors. |
|
S**Y 发帖数: 136 | 2 看到这么一题:
Implement atof function. eg., +3.5e-2, .03e1, 1e1, 0.0
这个还有逗号的情况,有许多种case,难道一个一个列举? 谁有什么比较clean的解法
啊? |
|
s*****o 发帖数: 1262 | 3 我一般用
if(argc>1) xxx=strtod(argv[1],NULL) 来读取command line的值
我发现atof也有同样的功能
不知道区别是什么,到网上搜了一下介绍strtod stof等的介绍,看不明白
谢谢 |
|
t****t 发帖数: 6806 | 4 try google "man atof", you get more or less the same thing at 1st result... |
|
r*******y 发帖数: 290 | 5 atof has its limitations:
http://www.cplusplus.com/reference/clibrary/cstdlib/atof.html
double atof ( const char * str );
Return Value
On success, the function returns the converted floating point number as a
double value.
If no valid conversion could be performed, or if the correct value would
cause underflow, a zero value (0.0) is returned.
If the correct value is out of the range of representable values, a positive
or negative HUGE_VAL is returned. |
|
a*****i 发帖数: 268 | 6 如果确定原始数据都是2位小数,还是可以atof后直接比较的。
虽然6.44+6.44==12.88不一定成立;atof("12.88") == atof("12.88")总是成立的。 |
|
l***i 发帖数: 1309 | 7 一个新想法,假设每个token的长度都不大,double类型的精度足够,不停的比两个
double,这样可以避免很多问题。
vector vs1, vs2;
// assume s has only 0-9 and .
// and begin with digit
vector split(string s)
{
vector ans;
int i;
for(i=0; i
int p=i;
for(; i
;
ans.push_back(s.substr(p, i-p));
return ans;
}
}
vs1 = split(s1);
vs2 = split(s2);
for(int i=0; i
string s1, s2;
s1 = "0." + vs1[i];
s2 = "0." + vs2[i]... 阅读全帖 |
|
p****e 发帖数: 3548 | 8 搞了个复杂的。。
// Type your C++ code and click the "Run Code" button!
// Your code output will be shown on the left.
// Click on the "Show input" button to enter input data to be read (from
stdin).
#include
using namespace std;
bool OpHigherOrder(char c1, char c2)
{
if(c1 != '(' && c2 == ')')
return true;
else if(c1 == '(')
return false;
else if((c1 == '*' || c1 == '/'))
return true;
else if((c1 == '+' || c1 == '-') && (c2 == '+' || c2 == '-'))
... 阅读全帖 |
|
p****e 发帖数: 3548 | 9 搞了个复杂的。。
// Type your C++ code and click the "Run Code" button!
// Your code output will be shown on the left.
// Click on the "Show input" button to enter input data to be read (from
stdin).
#include
using namespace std;
bool OpHigherOrder(char c1, char c2)
{
if(c1 != '(' && c2 == ')')
return true;
else if(c1 == '(')
return false;
else if((c1 == '*' || c1 == '/'))
return true;
else if((c1 == '+' || c1 == '-') && (c2 == '+' || c2 == '-'))
... 阅读全帖 |
|
r*********r 发帖数: 3195 | 10 这些function的适用性和性能成反比。
atof 只能用在 float/double。
sscanf 只能用在 integer, float.
lexical_cast 则可以使用在任何有operator>>定义的类型。
从性能上看,我猜的是 sscanf 比 lexical_cast 快5到10倍。
atof 又比 sscanf 快5倍左右。
还有,sscanf 是最容易用错的一个函数,对初学者简直是噩梦。 |
|
r****t 发帖数: 10904 | 11 >> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
>> locale.atof('100,340.23')
100340.23
python 是 strong typed, 怎么说类型转换比较弱? 就用
try: return locale.atof(content)
except: return "Illegal"
这样就可以了。 |
|
a******d 发帖数: 191 | 12 If you know exactly, the only steps involved are
1. Parsing string
2. Compare sesults in the previous step
Then you can still test
float(atof(stringA)) > float(atof(stringB))
Results guarenteed to be correct still. |
|
c*********t 发帖数: 2921 | 13 是不是先调用 float value = atof("3.72"),变成浮点数。
然后把浮点数value按照它在内存中的二进制打印出来?
就是把value弄成整数,然后写一个打印整数二进制的函数。
int i = *(int *)&value;
mybinprint(int i); |
|
|
|
l****c 发帖数: 838 | 16 You should read in the string and parse.
You don't know how long the first part string is or how long the number is.
So if you define:
char tempprice[10];
char ticker[10];
You have the risk of buffer overflow.
Here is my solution. I debug it as I wrote it, so it is not optimized.
it is pure C. You can get result with 2 lines of perl or python code
============================
#include
#include
#include
int main()
{
char *str = "GOOD|89.34";
char *ptoken, *... 阅读全帖 |
|
m*****6 发帖数: 38 | 17 周四的面试,第一个人的题目是remove duplicate linkedlist 和test她的眼镜
第二个人是,给你一个直角三角形的两边,算第三边
前面两个人答得还行,然后换了一幢楼面第三个
边吃饭边问如何test 一个touch screen,由于自己做过那方面,聊的还比较好,面好
后让我到一个角落等了15分钟,他又去叫了另外一个人
第四个人是如何merge 两个sorted array和给你时针和分针的角度,算出时间,基本也
都顺利答出来了。然后让我去楼下等了半小时,他又叫了另外一个给我面,这个人第一
题比较难,remove duplicate word in
a string 必须用C写,每个word用逗号隔开的,我说能不能用java split 和
hashtable,他说不行,这个没怎么写好,然后让我写了个atof ,基本都写出来了。
已经过去一天了,还是没有结果,据说微软的offer给的很快啊,担心会不会是拒信 |
|
l*****a 发帖数: 14598 | 18 他带框架还是隐性?
WOW atof, not atoi |
|
m*****6 发帖数: 38 | 19 自己以前准备过atoi,但是atof重来没写过,现在临时写的 |
|
h*******k 发帖数: 12 | 20 1 M*N 行列升序矩阵找X。
2 求时针分针夹角。
3 atof。
4 一条龙判赢。
一直向板上学习,回报各位同学,祝大家找工作顺利!
面试当天晚上收到结果给offer。
今天通知offer详细内容:90K base+50K stock+5K signup+5K relocation。
由于我面的微软在北卡,招聘那哥们说我的base等同于西雅图的100k。。。我也不知道
是真是假。。
总结:
答程序题的时候不要着急,慢慢写,宁可写得慢不能有错。写之前花时间和面试官
交流确定题目的明确含义,包括合法输入,数据类型,时空限制等,写的过程中解释每
一行代码的意义,充分考虑边界条件。总之心态要好。。。
|
|
|
j*****y 发帖数: 1071 | 22 bless
一条龙是什么阿 ? tic tac toe ?
double atof(char *s)
{
int i = 0;
while(s[i] && s[i] == ' ')
{
++i;
}
double num = 0;
bool flag_signal = false;
bool negative = false;
bool flag_dot = false;
vector afterDot;
while(s[i])
{
if(s[i] == '+' || s[i] == '-')
{
if(flag_dot)
{
break;
... 阅读全帖 |
|
h*******k 发帖数: 12 | 23 atof 应该要考虑溢出的情况。。。比如输入了老长老长的一个数。。 |
|
l*********y 发帖数: 142 | 24 下面这个方程计算 num! 的结果在base进制下的位数
比如说 5!的结果在10进制下是3位数,在16进制下是2位数。
题目限定 1<= num <= 2^20, and 1 <= base <= 800.
int GetNumDigit(int num, int base)
{
double result = 0;
for (int i = 1; i <= num; i++) {
result += log(i);
}
int digit = ceil(result / log(base) + 1e-10);
return digit;
}
我想请教1e-10在这里的使用? 我读过很多float and double精度的文章,所以知道result/log(base)的结果会有精度loss,但是我对精度补偿值的用法不是很懂。
包括何时用 还有 如何定值。以前还碰到一个例子是atof 时加了1e-10,
现在结合这个例子就完全没方向了。
谢谢了! |
|
h**p 发帖数: 377 | 25 我现在用的是atof(),先转成double
让後由double强制转换成long long
or use stringstream in c++
for example
const char* cstring="100000000"
long long num;
std::string lonstring;
std::stringstream converter;
converter<
coverter>>num;
from long to string
converter<
converter>>longstring; |
|
|
k****f 发帖数: 3794 | 27 FILE*fp=fopen("youdata","r");
char buf[1000];
int first,second;
char third[10],fourth[10];
double fifth;
while(fgets(buf,sizeof(buf),fp)){
char*p=strtok(buf,"|");
if(p==NULL)break;
first=atoi(p);
p=strtok(NULL,"|");
second=atoi(p);
p=strtok(NULL,"|");
strcpy(third,p);
p=strtok(NULL,"|");
strcpy(fourth,p);
p=strtok(NULL,"|");
fifth=atof(p);
}
fclose(fp);
how
.
me |
|
|
p***o 发帖数: 1252 | 29 You don't get it. Convert std::string to const char * is just one function
call. atof is the other and that's all.
Why bother to create/name an xxxxstream object, send in the string and
call the overloaded operator >>? |
|
t****t 发帖数: 6806 | 30 if you know you have char* and you want to double, then it is easier to use
atof
but stream works with template. e.g. you may say
template
void convert_to_whatever(const string& s, T& value)
{
istringstream iss(s);
iss>>value;
}
a good programmer can choose whatever tool that best fits the situation. |
|
p***o 发帖数: 1252 | 31 Yeah, but hardly to believe a guy knows how to write convert_to_whatever
will ask that question. And I would specialize the template to use atof
for double (need to change your design though).
use |
|
r*********r 发帖数: 3195 | 32 well, you have to put the usage in the right context.
if you are parsing millions of strings into floats (maybe
in high throughput networking environment?), then yeah,
atof or sscanf run much faster.
if you are only parsing the user input in an interactive
environment, why do you even care the complexity of the function
call? |
|
r*********r 发帖数: 3195 | 33 the error condition checking of c functions is so inconsistent.
in the case of atoi, atof, a return value of 0 simply doesn't tell whether
there is an scanning error or a 0 is correctly scanned. |
|
n*e 发帖数: 50 | 34 问题是他是csv里面带着 "," 的数字,假定不知道数字的位数有多少,不是很方便。
需要先知道怎么把那个数字field从两边的field里面分出来。
不过这个locale.atof我第一次见,收藏一下。 |
|
r****t 发帖数: 10904 | 35 只要 field 之间是 " ," 或者 " ," 分隔的,用这个 locale.atof 就有办法, 不需
要知道数字位数是多少。
反过来讲,如果 field 之间是 "," (没空格)分隔的,单个 field 里面的数字也是用
一样的分隔,就是人眼睛也不知道该如何分。 |
|
e******r 发帖数: 220 | 36 补充一下, 每十个数都差不多是下面的样式
206440.008 47.98979950 16.27552498 260.678058 0.0 74.40 0.14 0.37 -1.10 0.02
好象用strtok就可以把十个数parse出来, 可是如何检测每个字符串是float呢? 难道用atof()吗? |
|
b*d 发帖数: 75 | 37 in c++. i've used sstream, atof, strtod, none of them give me good precision
eg. 112.84375->112.844
haven't try sprintf but i guess it's the same.
i've also tried >>std::setprecios(20) and it doesn't help. the output
container is declared to double.
any idea how to keep the precision in the string? perhaps i have to use
boost lexical cast... |
|
z****e 发帖数: 2024 | 38 master shifu, 你哪里找的这个man page? |
|
t****t 发帖数: 6806 | 39 on my linux machine -- why do you care... |
|
|
|
s*****g 发帖数: 5159 | 42 问了好多virtual的问题,挺复杂的,我就不熟。
比如面我的是个物理phd,在考virtual的时候写了四个类(派生关系)、四个函数纠缠
了很久,编程就考了一个atof。
我现在不能再抱侥幸心理了,语言必须补上。你当我是一个1999年的C++程序员,推荐
书吧。 |
|
z****e 发帖数: 2024 | 43 你太牛鼻了。
简直是铁人啊!轻伤不下火线啊。
而且面试google,只问atof,牛人啊。
早日康复。 |
|
g*****1 发帖数: 998 | 44 文件中原始数据都是小数点后只有2位的比如 123.88 96.65
然后我用了float price = floor(atof(csvCell.c_str())*100)/100;
我知道一般c++里float数不能直接比较,因为看上去一样,可能不一样,
可是我保留了小数点后只有2位之后也不能直接比较吗 |
|
|
t****t 发帖数: 6806 | 46 我上次需要写一段code读一堆大文件, 文件里全是floating point number. 我一开始就
拿标准的strtod/atof写, 发现很慢. 后来到网上搜了一段code 代替strtod, 发现效率
提高400%以上... |
|
r*******n 发帖数: 3020 | 47 C 程序
char line[80];
char result_time[max][80];//结果1
float result_data[max]; //结果2
FILE *fp=fopen("data.dat","r");
int i=0;
while(fgets(line, 80,fp)){
int j=0;
while(line[j] != ',')
j++;
line[j]='\0';
strcpy(data_string+i,line);
strcpy(line, (line+j+1));
result_data[i] = atof(line);
}
fclose(fp); |
|