Giants are always problematic for an RPG. The physics of a humanoid giant don't really work IRL. But if you were to assume that a 24' tall creature weighing say 10 tons had mobility similar to a human, even a weak human for his size, the massive cludgel such a creature would carry would turn any person it hit to jello. So typically RPGs find ways to scale down the damage giants do without scaling down their strength. D20 is actually doing this subtly by giving the huge giant 16 times the normal carrying capacity for a given strength. That's a fudge factor within the rules that takes the giants non-linear increase in strength and linearizes it to ensure the scale of the damage is closer to normal.
So in a sense, giants aren't strong enough.
Giant strengths are chosen in 3.X in order to closely match the strength bonus of the original 1e giants using the new rules. For example, Frost Giants in 1e had a 21 Str, good for a +9 bonus to damage. Frost Giants in 3e therefore have a 29 strength, which is again good for a +9 bonus to damage. Interestingly, in 1e damage scaled up with strength, but the ability to hit didn't scale as fast as damage, so the 1e Frost Giant gained but a +4 to hit, while the 3e Frost Giant gains the full +9.
One thing I've been considering lately for making giants more viable as a low level opponent is to eliminate their racial HD and just give them levels. Under my rules that give bonus hit points based on size class, I know longer need nearly as much HD to fluff up hit points for large creatures. A Frost Giant 2nd level fighter would for example have an average of 37 hit points even without his racial HD. I haven't made the leap yet, but one nice feature of this is that giants would actually get more viable as both low level and high level opponent's, since giant HD aren't particularly CR efficient. Instead of facing 14HD giants, you'd be facing giant 14th level fighters or 14th level barbarians who happen to be giants.
Still not certain that this a good way to go, but it has its appeal.