Credit card validation
Avoid floating point
Actually I would advise the opposite of what @Xean said.  I would completely remove all floating point from your program, including any calls to pow and log.   I prefer your original loop to compute the number of digits.
The reason I don't like using floating point is that you might mysteriously get erroneous results due to roundoff errors.  For example, on my computer, when I do this:
val = pow(9, 17);

I get this result, which is off by one:
16677181699666568 (actual value should be one higher)

For your program, you could either write a simple function to compute the powers of ten you need, or even hardcode the four values you need since you are only using powers 12, 13, 14, and 15.