|
|
harold aptroot wrote: is that XOR-swap really faster than a normal swap?
How could it be? The XOR swap is to save space, not time.
|
|
|
|
|
PIEBALDconsult wrote: How could it be? Oh you want conjecture, do you? Ok: the extra temporary could have made it spill something to the stack, and doing the swap through memory is obviously slower than a XOR swap. Memory dependence misprediction penalties and forwarding delays and whatnot.
That only makes sense on 32bit, on 64bit there would obviously be plenty registers.
|
|
|
|
|
Does the result of the XOR have to be stored in a register/accumulator before being stored in the result?
|
|
|
|
|
No, not necessarily, the `xor mem, reg` form could be used. I don't see how that would help though.
|
|
|
|
|
harold aptroot wrote: how that would help
Contrarywise, I'd expect it to make things worse.
But it depends on the CPU.
|
|
|
|
|
|
Max Holder wrote: Only up to n=200; n=201 result is bigger than ulong
Are you sure about that? If I change the code to use a checked context for the addition:
checked { b += a; }
I get an overflow at n = 94 .
Using the original code, I see:
n = 92 : 7540113804746346429n = 93 : 12200160415121876738n = 94 : 1293530146158671551
That's clearly wrong; the result for 94 is less than the result for 92!
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
|
Can you explain what you actually are doing with the XOR's, what is the mathematics behind it? Im really curios about it.
modified 18-Apr-13 13:05pm.
|
|
|
|
|
|
Or you can combine two iterations so there is no swap:
private static ulong GetFib3(int n)
{
ulong a = 0;
ulong b = 1;
if (n == 0) return a;
if (n <= 2) return b;
if ((n & 1) == 0)
{
a = 1;
n--;
}
int i = n - 1;
do
{
a += b;
b += a;
i -= 2;
} while (i != 0);
return b;
}
|
|
|
|
|
Thanks for the implementation. I will compare your attempt along others posted in this thread later this day.
|
|
|
|
|
Good idea.
private static ulong
Fibo2
(
int n
)
{
ulong a = (ulong) n & 1 ;
ulong b = a ^ 1 ;
for ( n /= 2 ; n > 0 ; --n ) checked { a += b += a ; }
return ( a ) ;
}
(This version performs an extra add that I'm trying to eliminate.) Fixed.
modified 20-Apr-13 23:17pm.
|
|
|
|
|
"
if (n == 0) return a;
if (n == 1) return b;
"
Unnecessary, wastes cycles.
"
a ^= b;
b ^= a;
a ^= b;
"
Saves a few bytes, but wastes cycles.
And yours returns 1 for n<0.
Here's a version that swaps indices rather than values.
private static ulong[] a = new ulong [ 3 ] ;
private static ulong
Fibo
(
int n
)
{
a [ 0 ] = a [ 1 ] = 0 ;
a [ 2 ] = 1 ;
int x = 2 ;
int y = 1 ;
for ( ; n > 0 ; --n )
{
a [ 0 ] = a [ x ] += a [ y ] ;
x ^= 3 ;
y ^= 3 ;
}
return ( a [ 0 ] ) ;
}
modified 21-Apr-13 1:01am.
|
|
|
|
|
Hello All,
Project Brief:
I am wanting to create a program to allow the user to model a series of beams for a structural analysis program. There are many similar programs available on the web. You create nodes (points) in 3D space, link them together with members (lines) and then apply various loads and conditions to these elements. The project will consist mostly of 3D graphics (drawing primitives) which the user can interact with in order to enter the required data.
My History:
I am a structural engineer, not a software engineer, but I do a reasonable amount of coding in my free time. I am mostly familiar with Python but I have started learning C# which I feel is probably a better fit for this project. I will probably take the Winforms option for now since it a bit simpler for me to understand and will let me focus more on the structure of the program rather than the
The Question:
I would really appreciate advice on how to structure the program so I start out on the right track. My biggest question is how should I store all of the program data the user enters. I was thinking of using a database like sqlite3 so the file type for the model becomes *.db. Other options are wrapping everything up in a class (which holds node, member, loading info etc) and then dump as xml. I don’t know which option is better or even if there are other options out there. Using a database seem logical to me since the data will be somewhat relational, I just do not have the foresight to see if there are hidden challenges with this.
Any other adviCe you can give for implementing this project in C# would also be greatly appreciated.
Thanks all for your time.
Regards Jake
|
|
|
|
|
Why do you need to roll your own solution. What do the other packages out there not provide?
Autodesk would seem like a good fit if it solves the problem(s) you need.
"It's true that hard work never killed anyone. But I figure, why take the chance." - Ronald Reagan
That's what machines are for.
Got a problem?
Sleep on it.
|
|
|
|
|
Jacob Barton wrote: There are many similar programs available on the web.
What is your unique requirement that these many apps can't service.
PHP is not going to be much use to you for a winforms app . Seriouslydoing a project of this type is not a trivial pursuit, be certain you really need to embark on it. Especially with your limited skill set.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
Mycroft Holmes wrote: What is your unique requirement that these many apps can't service.
Primary Reason:
These applications are a one shoe fits all solution. They are made to service the largest community available so they can maximize their user base. There are many different engineering problems that require slightly different design solutions and this is often achieved by using multiple software packages and hand calculations. Yes this works, but it can be more efficient. The base functionality of my program will be the same as others (to a certain degree), it is the ability to add additional functionality for performing routine design tasks (specific to my particular applications) that I am most interested in.
Secondary Reasons:
1) Seems like a good project to learn OpenGL and fundamentals behind interaction with 3D scenes
2) Expands my skill base so the next time I want to undertake a ambitious project I know what skills I can leverage off.
3) I enjoy learning new things
4) I'm an engineer, making things harder then they need to be is part of my job
If you look at how these programs work, they are not overly complex. I see graphics as my biggest challenge by far. Sure, implementing the design is not trivial which is why I asked for help. I don't care if I don't get it right the first time, but some bread crumbs to follow would be nice.
Many thanks,
Jake
|
|
|
|
|
None of which I can argue with, I consider rolling your own a primary mark of a good developer. As long as you are making this to your requirements and don't try and do the another one shoe fits all, scope creep is going to be a major irritant. If it is not core to your needs don't try and build it into your first attempt.
Unlike POH I would go for a relational database, but that is what I do, LOB apps, not engineering based calculators/modellers.
Do keep notes on your progress it could turn into an interesting article.
Never underestimate the power of human stupidity
RAH
|
|
|
|
|
A database would be a fine choice. You could go with something like sqllite or you could go with a NoSQL database like MongoDB. If I were looking to associate documents with these beams (might be an interesting addition), then I'd definitely lean towards a NoSQL solution over a traditional relational database.
|
|
|
|
|
Thanks Pete will take that on board and look into NoSQL. Are databases frequently used in this type of application (i.e. as a main filetype for an application)?
|
|
|
|
|
I've used them for this. Some companies prefer to roll their own code, but ultimately they end up creating proprietary databases.
|
|
|
|
|
Your first task is to define exactly what you want to store, and how the data is used. For instance (haven't done any structural engineering calculations since college mumble years ago, so this is uninformed):
- Can nodes be re-used (ie serve as end points for multiple beams)?
- Should join strength be a variable or ideal?
- Is there a common joint, or are one connected to side of other?
- Can you have multiple load vectors on each beam?
- What types of load do you want to model (of the five classic)?
- Do you want to distinguish between, for want of a better term, primary (entered by user) and secondary (calculated and distributed over the structure) loads?
The answers to these and similar questions should help you model the application and storage. Always start with function, and let form (e.g. GUI and storage model) follow.
For instance, I'd probably keep nodes, members and primary and secondary loads separate in a relational database, and let the loads have a relationship to a member, which has a relationship to two nodes. So that's four tables of data to start you with.
Oh, and I'd recommend using a database even if the data amount isn't going to be massive. The benefit of having a proper relational structure outweighs the extra work needed to manage it.
|
|
|
|
|
Pete, Orjan, thanks for the helpful posts.
Orjan Westin wrote: For instance, I'd probably keep nodes, members and primary and secondary loads separate in a relational database, and let the loads have a relationship to a member, which has a relationship to two nodes. So that's four tables of data to start you with.
Orjan, this is what I had in mind. I will probably start with node loads, concentrated member loads and uniform (trapezoidal) member loads. I think the database approach will keep things scalable if I decide to go further than this.
|
|
|
|