Is scanf or any other function capable of reading numbers in the format
1.2345d-13 where 'd' serves the same role as 'e' usually does in scientific
notation? This operation is iterated through several times and we really
would like not to have to read it as a string first or anything like that.
Thanks
--
Vig 4 2280
In article <d1**********@n ews-int.gatech.edu> ,
Vig <gt*****@mail.g atech.edu> wrote:
:Is scanf or any other function capable of reading numbers in the format
:1.2345d-13 where 'd' serves the same role as 'e' usually does in scientific
:notation?
Not scanf(), and not any other standard C library routine that I can think of.
:This operation is iterated through several times and we really
:would like not to have to read it as a string first or anything like that.
Surely the slow part of the operation would be the read from disk?
Once the input line has been read from disk, it is going to be in
memory, in which case you can replace the 'd' with 'e' and sscanf()
the result. All it costs is examining the input line once or twice more
in memory.
If you get stuck, then provided the copyright issues are
compatible with your legal situations, you could use a slightly
modified version of glibc's scanf() function.
--
I was very young in those days, but I was also rather dim.
-- Christopher Priest
"Walter Roberson" <ro******@ibd.n rc-cnrc.gc.ca> wrote in message
news:d1******** **@canopus.cc.u manitoba.ca... Not scanf(), and not any other standard C library routine that I can think
of.
Yes. Me neither. The only place I've seen the format used is by Fortran
people. Can anyone confirm that C does not support reading numbers like
this?
Surely the slow part of the operation would be the read from disk? Once the input line has been read from disk, it is going to be in memory, in which case you can replace the 'd' with 'e' and sscanf() the result. All it costs is examining the input line once or twice more in memory.
Almost everything we read from files are numbers. Currently, it is scanned
with a %lf unless otherwise specified. If we are to handle the problem of
the 'd' that would mean almost multiplying our time for reading even good
files without d's by 3. Also, I cannot directly replace an e with a d
because Scientific notation is usually written as 0.123456e+01 while d is
1.23456d0 (I am not completely sure, which is why I want C to handle it all
for me :) )
--
Vig
In article <d1**********@n ews-int.gatech.edu> ,
Vig <gt*****@mail.g atech.edu> wrote:
:Also, I cannot directly replace an e with a d
:because Scientific notation is usually written as 0.123456e+01 while d is
:1.23456d0 (I am not completely sure, which is why I want C to handle it all
:for me :) )
On output, C's e format,
is converted to the style [-]d.ddde+dd, where there is one digit
before the decimal-point character (which is nonzero if the
argument is nonzero)
On input, a string of digits is accepted before the decimal point.
The sign after the 'e' on input is optional. Thus, 0.123456e+01
and 1.23456e0 are equivilent [except perhaps in the last bit or two
when one is at the limit of precision.]
:Almost everything we read from files are numbers. Currently, it is scanned
:with a %lf unless otherwise specified. If we are to handle the problem of
:the 'd' that would mean almost multiplying our time for reading even good
:files without d's by 3.
No, that doesn't follow. The time required to read data from a file is
largely dominated by the disk I/O rate... modified by operating
system predictive reads, direct I/O or not, DMA block size, SCSI
Command Tag Queuing (CTQ), ability of the OS to flip a DMA page
directly into user space without having to copy it, and so on.
When you use scanf(), then unless you have specifically turned off
buffering, the C I/O library will usually [but not promised in the
standard] fill a block from the I/O subsytem (or I/O cache),
putting the block into your memory space; the block size is often
8 Kb. Once the block has been read in, scanf() is really just
reading the data from memory, as if it were using getc() to fetch
each character. [It has to be that way because you are allowed
to mix getc() and scanf(), so they both have to read from the
same input buffer, and it usually isn't worth duplicating the
logic.] getc() is usually a macro that works with the FILE
structure.
The slow part of reading is getting the data from disk to your
program the first time; once there, you could examine the data a
number of times before the next batch was ready. For example if your
disk subsystem is SCSI-2 Fast, your disk might be limited to
20 megabytes per second; on a 2 GHz CPU, you could run 100
cycles per character and still keep up with the disk.
If you are sufficiently starved for CPU resources that
doing a quick scan-and-replace over the buffer is slowing you
down, then you should probably already have done a bunch
of work on custom I/O (e.g., using "real time" partitions,
using a raw partition instead of a block device, using
scatter-gather buffering, using any available O/S
facilities to bypass caching; ensuring your input data
is always a multiple of an I/O page and always reading
in full blocks instead of going through the per-character
end-of-buffer checks imposed by getc().) You should not
presume that a simple scan over the buffer will prove
to be the limiting speed factor on your program: it
probably won't.
Speaking of limiting speed factors: consider having a
pre-pass program that does nothing other than reading in
the data and converting it to binary and storing the
binary as a file with fixed length records. Such a program
could probably run asynchronously with whatever calculation
you are doing -- and if you are reading the input file
multiple times in different programs, you will have
saved having to convert the ASCII multiple times.
You will get about a 3:1 compression ratio by converting
the input to binary.
--
Any sufficiently old bug becomes a feature.
"Walter Roberson" <ro******@ibd.n rc-cnrc.gc.ca> wrote in message
news:d1******** **@canopus.cc.u manitoba.ca... :Also, I cannot directly replace an e with a d :because Scientific notation is usually written as 0.123456e+01 while d is :1.23456d0 (I am not completely sure, which is why I want C to handle it
all :for me :) )
On output, C's e format,
is converted to the style [-]d.ddde+dd, where there is one digit before the decimal-point character (which is nonzero if the argument is nonzero)
Yes...It's pretty retarded of me to grumble about convention if converting
d's to e's will still be read correctly.
On input, a string of digits is accepted before the decimal point. The sign after the 'e' on input is optional. Thus, 0.123456e+01 and 1.23456e0 are equivilent [except perhaps in the last bit or two when one is at the limit of precision.]
:Almost everything we read from files are numbers. Currently, it is
scanned :with a %lf unless otherwise specified. If we are to handle the problem
of :the 'd' that would mean almost multiplying our time for reading even good :files without d's by 3.
No, that doesn't follow. The time required to read data from a file is largely dominated by the disk I/O rate... modified by operating system predictive reads, direct I/O or not, DMA block size, SCSI Command Tag Queuing (CTQ), ability of the OS to flip a DMA page directly into user space without having to copy it, and so on.
Ya...just thinking it out and talking to you has made me remove a lot of
ridiculous code I had put in place. I think the d to e substitution will
work albeit it would have to be done smartly when I am more awake :)
When you use scanf(), then unless you have specifically turned off buffering, the C I/O library will usually [but not promised in the standard] fill a block from the I/O subsytem (or I/O cache), putting the block into your memory space; the block size is often 8 Kb. Once the block has been read in, scanf() is really just reading the data from memory, as if it were using getc() to fetch each character. [It has to be that way because you are allowed to mix getc() and scanf(), so they both have to read from the same input buffer, and it usually isn't worth duplicating the logic.] getc() is usually a macro that works with the FILE structure.
The slow part of reading is getting the data from disk to your program the first time; once there, you could examine the data a number of times before the next batch was ready. For example if your disk subsystem is SCSI-2 Fast, your disk might be limited to 20 megabytes per second; on a 2 GHz CPU, you could run 100 cycles per character and still keep up with the disk.
If you are sufficiently starved for CPU resources that doing a quick scan-and-replace over the buffer is slowing you down, then you should probably already have done a bunch of work on custom I/O (e.g., using "real time" partitions, using a raw partition instead of a block device, using scatter-gather buffering, using any available O/S facilities to bypass caching; ensuring your input data is always a multiple of an I/O page and always reading in full blocks instead of going through the per-character end-of-buffer checks imposed by getc().) You should not presume that a simple scan over the buffer will prove to be the limiting speed factor on your program: it probably won't.
Speaking of limiting speed factors: consider having a pre-pass program that does nothing other than reading in the data and converting it to binary and storing the binary as a file with fixed length records. Such a program could probably run asynchronously with whatever calculation you are doing -- and if you are reading the input file multiple times in different programs, you will have saved having to convert the ASCII multiple times. You will get about a 3:1 compression ratio by converting the input to binary.
That is actually a good idea, but I had to stamp it out of my head in about
10 seconds because I am only fixing a bug right now and there doesn't seem
to be a possibility of me being able to talk people into this :)
Any sufficiently old bug becomes a feature.
And Vice Versa :)
Thanks for all the help
--
Vig This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: B Thomas |
last post by:
Hi,
I was reading O'Reilly's "Practical C programming" book and it warns
against the use of scanf, suggesting to avoid using it completely .
Instead it recomends to use using fgets and sscanf. However no
explanation is offered other than that scanf handels end of lines very
badly. I have exeperienced such problems when doing some numerical
programming but never understood it. Things like some consequitive
scanfs would not read in values...
|
by: hugo27 |
last post by:
obrhy8 June 18, 2004
Most compilers define EOF as -1. I'm just putting my toes
in the water with a student's model named Miracle C. The
..h documentation of this compiler does state that when
scanf cannot fill any fields it returns EOF.
I have run some tests on scanf and, so far, I've not found
an EOF return.
For example: If the programer formats scanf for an int or
|
by: Rob Thorpe |
last post by:
Given the code:-
r = sscanf (s, "%lf", x);
What is the correct output if the string s is simply "-" ?
If "-" is considered the beginning of a number, that has been
cut-short then the correct output is that r = EOF. If it is taken to
be a letter in the stream, then the output should be r = 0, as far as
I can see. My compiler gives EOF.
|
by: Lefty Bigfoot |
last post by:
Hello,
I am aware that a lot of people are wary of using scanf,
because doing it improperly can be dangerous. I have
tried to find a good tutorial on all the ins and outs
of scanf() but been unsuccessful.
Is there a well-respected (by the c.l.c crowd) book
or tutorial that really covers scanf in detail?
|
by: Lalatendu Das |
last post by:
Dear friends,
I am getting a problem in the code while interacting with a nested
Do-while loop
It is skipping a scanf () function which it should not. I have written
the whole code below. Please help me in finding why such thing is
happening and what the remedy to it is. Kindly bear with my English.
int
main ()
| |
by: stasgold |
last post by:
Hello.
I maybe reinvent the weel ...
I'm trying to read positive integer number with the help of scanf, if
the input value is not positive number but negaive one zero or char , i
have to reread the input until I get the needed pos. number
I wrote the code , but it doesn't work the way it should : if i put
some char into input, the program goes infinite loop instead of
promting me to enter a new value.
|
by: Xavoux |
last post by:
Hello all...
I can't remind which function to use for safe inputs...
gets, fgets, scanf leads to buffer overflow...
i compiled that code with gcc version 2.95.2, on windows 2000
char tmp0 = "ABCDEFGHI\0";
char buff; /* Input buffer. */
char tmp1 = "ABCDEFGHI\0";
|
by: Tinku |
last post by:
#include<stdio.h>
main()
{
char line;
scanf("%", line);
printf("%s", line);
}
it will read and print the line but what is "%" in general we
gives %s, %c .
|
by: subramanian100in |
last post by:
Consider the following program named as x.c
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
unsigned int u;
char str;
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However, people are often confused as to whether an ONU can Work As a Router. In this blog post, we’ll explore What is ONU, What Is Router, ONU & Router’s main usage, and What is the difference between ONU and Router. Let’s take a closer look !
Part I. Meaning of...
|
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven tapestry of website design and digital marketing. It's not merely about having a website; it's about crafting an immersive digital experience that captivates audiences and drives business growth.
The Art of Business Website Design
Your website is...
| |
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new presenter, Adolph Dupré who will be discussing some powerful techniques for using class modules.
He will explain when you may want to use classes instead of User Defined Types (UDT). For example, to manage the data in unbound forms.
Adolph will...
|
by: conductexam |
last post by:
I have .net C# application in which I am extracting data from word file and save it in database particularly. To store word all data as it is I am converting the whole word file firstly in HTML and then checking html paragraph one by one.
At the time of converting from word file to html my equations which are in the word document file was convert into image.
Globals.ThisAddIn.Application.ActiveDocument.Select();...
|
by: TSSRALBI |
last post by:
Hello
I'm a network technician in training and I need your help.
I am currently learning how to create and manage the different types of VPNs and I have a question about LAN-to-LAN VPNs.
The last exercise I practiced was to create a LAN-to-LAN VPN between two Pfsense firewalls, by using IPSEC protocols.
I succeeded, with both firewalls in the same network. But I'm wondering if it's possible to do the same thing, with 2 Pfsense firewalls...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated we have to send another system
|
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |
by: bsmnconsultancy |
last post by:
In today's digital era, a well-designed website is crucial for businesses looking to succeed. Whether you're a small business owner or a large corporation in Toronto, having a strong online presence can significantly impact your brand's success. BSMN Consultancy, a leader in Website Development in Toronto offers valuable insights into creating effective websites that not only look great but also perform exceptionally well. In this comprehensive...
| |